[Libreoffice-commits] core.git: Branch 'feature/cib_contract3753' - 4 commits - include/svx sc/source svx/source sw/qa sw/source
Serge Krot (via logerrit)
logerrit at kemper.freedesktop.org
Thu Feb 13 09:12:53 UTC 2020
Rebased ref, commits from common ancestor:
commit c38ba97261c0af28cb48786a7ad7edcab1e85cb4
Author: Serge Krot <Serge.Krot at cib.de>
AuthorDate: Tue Feb 11 16:04:26 2020 +0100
Commit: Serge Krot (CIB) <Serge.Krot at cib.de>
CommitDate: Thu Feb 13 09:47:40 2020 +0100
tdf#130610 docx export: handle bold as toggle properties
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88460
Reviewed-by: Michael Stahl <michael.stahl at cib.de>
Tested-by: Jenkins
Conflicts:
sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
Change-Id: I4c60b7eab6430a64ea1c8bcf40d0036d0b38516f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88574
Tested-by: Jenkins
Reviewed-by: Serge Krot (CIB) <Serge.Krot at cib.de>
diff --git a/sw/qa/extras/ooxmlexport/data/tdf130610_bold_in_2_styles.ott b/sw/qa/extras/ooxmlexport/data/tdf130610_bold_in_2_styles.ott
new file mode 100755
index 000000000000..35937d9a8aa3
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf130610_bold_in_2_styles.ott differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
index bb9e3932320f..2ddc72515991 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
@@ -18,6 +18,7 @@
#include <com/sun/star/text/TableColumnSeparator.hpp>
#include <com/sun/star/text/RelOrientation.hpp>
#include <com/sun/star/text/XDocumentIndex.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
class Test : public SwModelTestBase
{
@@ -90,6 +91,34 @@ DECLARE_OOXMLEXPORT_TEST(testTdf87569d, "tdf87569_drawingml.docx")
text::RelOrientation::FRAME, nValue);
}
+DECLARE_OOXMLEXPORT_TEST(testTdf130610, "tdf130610_bold_in_2_styles.ott")
+{
+ // check character properties
+ {
+ uno::Reference<beans::XPropertySet> xStyle(
+ getStyles("CharacterStyles")->getByName("WollMuxRoemischeZiffer"),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Bold", awt::FontWeight::BOLD, getProperty<float>(xStyle, "CharWeight"));
+ }
+
+ // check paragraph properties
+ {
+ uno::Reference<beans::XPropertySet> xStyle(
+ getStyles("ParagraphStyles")->getByName("WollMuxVerfuegungspunkt"),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Bold", awt::FontWeight::BOLD, getProperty<float>(xStyle, "CharWeight"));
+ }
+
+ // check inline text properties
+ {
+ xmlDocPtr pXmlDoc =parseExport("word/document.xml");
+ if (pXmlDoc)
+ {
+ assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/w:rPr/w:b");
+ }
+ }
+}
+
DECLARE_OOXMLEXPORT_TEST(testTdf120315, "tdf120315.docx")
{
// tdf#120315 cells of the second column weren't vertically merged
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
index 3df5950cff84..cac4cdf247e1 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -43,6 +43,7 @@
#include <editeng/formatbreakitem.hxx>
#include <editeng/frmdiritem.hxx>
#include <editeng/tstpitem.hxx>
+#include <editeng/wghtitem.hxx>
#include <svl/grabbagitem.hxx>
#include <svl/urihelper.hxx>
#include <svl/whiter.hxx>
@@ -473,6 +474,12 @@ void SwWW8AttrIter::OutAttr( sal_Int32 nSwPos, bool bWriteCombChars)
if ( pCharFormatItem )
ClearOverridesFromSet( *pCharFormatItem, aExportSet );
+ // check toggle properties in DOCX output
+ {
+ SvxWeightItem aBoldProperty(WEIGHT_BOLD, RES_CHRATR_WEIGHT);
+ handleToggleProperty(aExportSet, pCharFormatItem, RES_CHRATR_WEIGHT, &aBoldProperty);
+ }
+
// tdf#113790: AutoFormat style overwrites char style, so remove all
// elements from CHARFMT grab bag which are set in AUTOFMT grab bag
if (const SfxGrabBagItem *pAutoFmtGrabBag = dynamic_cast<const SfxGrabBagItem*>(pGrabBag))
@@ -535,6 +542,64 @@ void SwWW8AttrIter::OutAttr( sal_Int32 nSwPos, bool bWriteCombChars)
m_rExport.AttrOutput().OutputItem( *pGrabBag );
}
+// Toggle Properties
+//
+// If the value of the toggle property appears at multiple levels of the style hierarchy (17.7.2), their
+// effective values shall be combined as follows:
+//
+// value_{effective} = val_{table} XOR val_{paragraph} XOR val_{character}
+//
+// If the value specified by the document defaults is true, the effective value is true.
+// Otherwise, the values are combined by a Boolean XOR as follows:
+// i.e., the effective value to be applied to the content shall be true if its effective value is true for
+// an odd number of levels of the style hierarchy.
+//
+// To prevent such logic inside output, it is required to write inline w:b token on content level.
+void SwWW8AttrIter::handleToggleProperty(SfxItemSet& rExportSet, const SwFormatCharFormat* pCharFormatItem,
+ sal_uInt16 nWhich, const SfxPoolItem* pValue)
+{
+ if (!rExportSet.HasItem(nWhich) && pValue)
+ {
+ bool hasPropertyInCharStyle = false;
+ bool hasPropertyInParaStyle = false;
+
+ // get bold flag from specified character style
+ if (pCharFormatItem)
+ {
+ if (const SwCharFormat* pCharFormat = pCharFormatItem->GetCharFormat())
+ {
+ const SfxPoolItem* pItem = nullptr;
+ if (pCharFormat->GetAttrSet().HasItem(nWhich, &pItem))
+ {
+ hasPropertyInCharStyle = (*pItem == *pValue);
+ }
+ }
+ }
+
+ // get bold flag from specified paragraph style
+ {
+ SwTextFormatColl& rTextColl = static_cast<SwTextFormatColl&>( rNd.GetAnyFormatColl() );
+ sal_uInt16 nStyle = m_rExport.m_pStyles->GetSlot( &rTextColl );
+ nStyle = ( nStyle != 0xfff ) ? nStyle : 0;
+ const SwFormat* pFormat = m_rExport.m_pStyles->GetSwFormat(nStyle);
+ if (pFormat)
+ {
+ const SfxPoolItem* pItem = nullptr;
+ if (pFormat->GetAttrSet().HasItem(nWhich, &pItem))
+ {
+ hasPropertyInParaStyle = (*pItem == *pValue);
+ }
+ }
+ }
+
+ // add inline property
+ if (hasPropertyInCharStyle && hasPropertyInParaStyle)
+ {
+ rExportSet.Put(*pValue);
+ }
+ }
+}
+
bool SwWW8AttrIter::IsWatermarkFrame()
{
if (maFlyFrames.size() != 1)
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 9824f52b7d84..8c9c324d0509 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -1527,6 +1527,8 @@ private:
SwWW8AttrIter(const SwWW8AttrIter&) = delete;
SwWW8AttrIter& operator=(const SwWW8AttrIter&) = delete;
+
+ void handleToggleProperty(SfxItemSet& rExportSet, const SwFormatCharFormat* pCharFormatItem, sal_uInt16 nWhich, const SfxPoolItem* pValue);
public:
SwWW8AttrIter( MSWordExportBase& rWr, const SwTextNode& rNd );
commit d3e77bd112c3f7084b0dd92c36ff60f1fd1ddc2f
Author: Xisco Faulí <xiscofauli at libreoffice.org>
AuthorDate: Wed Feb 12 11:51:34 2020 +0100
Commit: Xisco Faulí <xiscofauli at libreoffice.org>
CommitDate: Thu Feb 13 07:41:21 2020 +0100
tdf#130614: Revert "tdf#125520 Fix OLE objects drag&drop with 'Insert as Copy'"
This reverts commit e4cea049c80f4fd6d2a586e73fe9fa08ebd08371.
Change-Id: Ic925cb5660df152208cdc63bfee62d82fe912717
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88493
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
(cherry picked from commit 09e6824bc868990095233825c415556399dd0652)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88500
Reviewed-by: Xisco Faulí <xiscofauli at libreoffice.org>
diff --git a/svx/source/svdraw/svdxcgv.cxx b/svx/source/svdraw/svdxcgv.cxx
index f18d536b7bf2..8fcd742ec71f 100644
--- a/svx/source/svdraw/svdxcgv.cxx
+++ b/svx/source/svdraw/svdxcgv.cxx
@@ -744,17 +744,8 @@ std::unique_ptr<SdrModel> SdrExchangeView::CreateMarkedObjModel() const
if(nullptr == pNewObj)
{
- // not cloned yet
- if (pObj->GetObjIdentifier() == OBJ_OLE2)
- {
- // tdf#125520
- pNewObj = pObj->CloneSdrObject(pObj->getSdrModelFromSdrObject());
- }
- else
- {
- // use default way
- pNewObj = pObj->CloneSdrObject(*pNewModel);
- }
+ // not cloned yet, use default way
+ pNewObj = pObj->CloneSdrObject(*pNewModel);
}
if(pNewObj)
commit c9605cc66bcc655f3d7c8f3264efa691de42aed5
Author: Caolán McNamara <caolanm at redhat.com>
AuthorDate: Mon Feb 3 12:06:23 2020 +0000
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Wed Feb 12 22:23:02 2020 +0100
ofz#20455 sw: HTML import: fix invalid table in footer
The obvious problem was that a bookmark failed to be copied to the
correct node, it was created on a SwStartNode, which failed in
makeMark() and caused a null-pointer.
The target position was off by 1 node because there was a spurious
StartNode/EndNode pair directly below the table:
[ 41] 0x5b13430 TableNode ,
[ 42] 0x5b1d010 StartNode ,
[ 43] 0x5b12a50 StartNode ,
[ 44] 0x5b135f0 TextNode "",
This was created by a special case in SwTableNode::MakeCopy() because
.GetTabSortBoxes().size() == 1.
But the table had actually quite a bunch more cells in the nodes-array,
just they were not yet in the SwTable.
In an exciting twist of events, it turns out the table was copied while
it was not yet finished parsing: the problem was that in the middle of
the table, some CSS set some page attributes, and this caused a
first-page page style to be created in SwCSS1Parser::ParseStyleSheet(),
by copying the master page style.
Unfortunately the table was in the <div title="footer">, so it was
copied in this incomplete and inconsistent state.
It might be possible to get rid of the special case in
SwTableNode::MakeCopy() by restricting the special case skipping of
StartNodes at the start in SwNodes::CopyNodes() a bit so that StartNodes
whose EndNodes are copied aren't skipped; at least that's the most
reasonable explanation for the special case.
But for now just fix the HTML import.
Additionally, only on MacOSX, using libc++, this triggered an assert:
Assertion failed: (!pImpl->mpStaticDefaults || typeid(rItem) == typeid(GetDefaultItem(nWhich))), function PutImpl, file /Users/tdf/lode/jenkins/workspace/lo_gerrit/Config/macosx_clang_dbgutil/svl/source/items/itempool.cxx, line 611.
Probably because SdrTextAniCountItem is not marked DLLPUBLIC.
Change-Id: Ia167265e7540eea649801eaac2b89f9e18b685cd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87859
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl at cib.de>
(cherry picked from commit 086e43148059a7ebc6caa416fa82bb60fd2cc92f)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88494
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/include/svx/sdtacitm.hxx b/include/svx/sdtacitm.hxx
index bf145c8b6b6c..f34e5589ed53 100644
--- a/include/svx/sdtacitm.hxx
+++ b/include/svx/sdtacitm.hxx
@@ -23,7 +23,7 @@
#include <svx/svddef.hxx>
// Number of loops. 0=infinite.
-class SdrTextAniCountItem final : public SfxUInt16Item {
+class SAL_DLLPUBLIC_RTTI SdrTextAniCountItem final : public SfxUInt16Item {
public:
SdrTextAniCountItem(sal_uInt16 nVal=0): SfxUInt16Item(SDRATTR_TEXT_ANICOUNT,nVal) {}
diff --git a/sw/qa/core/data/html/pass/ofz20455.html b/sw/qa/core/data/html/pass/ofz20455.html
new file mode 100644
index 000000000000..6e5ca0aa7e85
Binary files /dev/null and b/sw/qa/core/data/html/pass/ofz20455.html differ
diff --git a/sw/source/filter/html/htmlcss1.cxx b/sw/source/filter/html/htmlcss1.cxx
index e7a1827543a6..4f8d8bbe7d03 100644
--- a/sw/source/filter/html/htmlcss1.cxx
+++ b/sw/source/filter/html/htmlcss1.cxx
@@ -90,11 +90,13 @@ void SwCSS1Parser::ChgPageDesc( const SwPageDesc *pPageDesc,
m_pDoc->ChgPageDesc( pos, rNewPageDesc );
}
-SwCSS1Parser::SwCSS1Parser( SwDoc *pD, const sal_uInt32 aFHeights[7], const OUString& rBaseURL, bool bNewDoc ) :
- SvxCSS1Parser( pD->GetAttrPool(), rBaseURL,
- aItemIds, SAL_N_ELEMENTS(aItemIds)),
- m_pDoc( pD ),
- m_nDropCapCnt( 0 ),
+SwCSS1Parser::SwCSS1Parser(SwDoc *const pDoc, SwHTMLParser const& rParser,
+ const sal_uInt32 aFHeights[7], const OUString& rBaseURL, bool const bNewDoc)
+ : SvxCSS1Parser(pDoc->GetAttrPool(), rBaseURL,
+ aItemIds, SAL_N_ELEMENTS(aItemIds))
+ , m_pDoc( pDoc )
+ , m_rHTMLParser(rParser)
+ , m_nDropCapCnt( 0 ),
m_bIsNewDoc( bNewDoc ),
m_bBodyBGColorSet( false ),
m_bBodyBackgroundSet( false ),
@@ -1344,6 +1346,12 @@ const SwPageDesc *SwCSS1Parser::GetPageDesc( sal_uInt16 nPoolId, bool bCreate )
const SwPageDesc *pPageDesc = FindPageDesc(m_pDoc, nPoolId);
if( !pPageDesc && bCreate )
{
+ if (m_rHTMLParser.IsReadingHeaderOrFooter())
+ { // (there should be only one definition of header/footer in HTML)
+ SAL_WARN("sw.html", "no creating PageDesc while reading header/footer");
+ return nullptr;
+ }
+
// The first page is created from the right page, if there is one.
SwPageDesc *pMasterPageDesc = nullptr;
if( RES_POOLPAGE_FIRST == nPoolId )
diff --git a/sw/source/filter/html/swcss1.hxx b/sw/source/filter/html/swcss1.hxx
index c6a3e6bdb8fd..54d03edb5892 100644
--- a/sw/source/filter/html/swcss1.hxx
+++ b/sw/source/filter/html/swcss1.hxx
@@ -33,6 +33,7 @@ class SwTextFormatColl;
class SvxBrushItem;
class SwFormatDrop;
class SwPageDesc;
+class SwHTMLParser;
// This header looks harmless, but includes still quite
// inconspicuous one or the other! On the other hand this class
@@ -41,6 +42,7 @@ class SwPageDesc;
class SwCSS1Parser : public SvxCSS1Parser
{
SwDoc *m_pDoc;
+ SwHTMLParser const& m_rHTMLParser;
sal_uLong m_aFontHeights[7];
@@ -75,7 +77,8 @@ protected:
using CSS1Parser::ParseStyleSheet;
public:
- SwCSS1Parser( SwDoc *pDoc, sal_uInt32 const aFHeight[7], const OUString& rBaseURL, bool bNewDoc );
+ SwCSS1Parser( SwDoc *pDoc, SwHTMLParser const& rParser,
+ sal_uInt32 const aFHeight[7], const OUString& rBaseURL, bool bNewDoc);
virtual ~SwCSS1Parser() override;
virtual bool ParseStyleSheet( const OUString& rIn ) override;
diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx
index 4a5003c0dd7c..aaa6c2e7dd35 100644
--- a/sw/source/filter/html/swhtml.cxx
+++ b/sw/source/filter/html/swhtml.cxx
@@ -359,7 +359,7 @@ SwHTMLParser::SwHTMLParser( SwDoc* pD, SwPaM& rCursor, SvStream& rIn,
m_bOldIsHTMLMode = m_xDoc->getIDocumentSettingAccess().get(DocumentSettingId::HTML_MODE);
m_xDoc->getIDocumentSettingAccess().set(DocumentSettingId::HTML_MODE, true);
- m_pCSS1Parser.reset( new SwCSS1Parser( m_xDoc.get(), m_aFontHeights, m_sBaseURL, IsNewDoc() ) );
+ m_pCSS1Parser.reset(new SwCSS1Parser(m_xDoc.get(), *this, m_aFontHeights, m_sBaseURL, IsNewDoc()));
m_pCSS1Parser->SetIgnoreFontFamily( rHtmlOptions.IsIgnoreFontFamily() );
if( bReadUTF8 )
diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx
index b9173c6271ab..58eaaaab715e 100644
--- a/sw/source/filter/html/swhtml.hxx
+++ b/sw/source/filter/html/swhtml.hxx
@@ -923,6 +923,8 @@ public:
bool IsReqIF() const;
+ bool IsReadingHeaderOrFooter() const { return m_bReadingHeaderOrFooter; }
+
void NotifyMacroEventRead();
/// Strips query and fragment from a URL path if base URL is a file:// one.
commit 2c9dc34b332b6cb4c121e85989e4e8e2ab822ea5
Author: Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Sat Jan 18 12:01:24 2020 +0300
Commit: Eike Rathke <erack at redhat.com>
CommitDate: Wed Feb 12 17:58:15 2020 +0100
tdf#130054: consider all row/col bars in ScTabView::EnableRefInput
Left col bar and bottom row bar were ignored - apparently overlooked
at least since commit 9ae5a91f7955e44d3b24a3f7741f9bca02ac7f24.
Change-Id: I5c2386b0aa1fdbb42f352c0b654e268dc62c7e66
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87007
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
(cherry picked from commit bda31b1a95b284749cd5e4d9596aab8e1aa93714)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87022
Reviewed-by: Eike Rathke <erack at redhat.com>
diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx
index ec52581dad23..53e03e61de07 100644
--- a/sc/source/ui/view/tabview.cxx
+++ b/sc/source/ui/view/tabview.cxx
@@ -2245,18 +2245,15 @@ void ScTabView::EnableRefInput(bool bFlag)
if(pTabControl!=nullptr) pTabControl->EnableInput(bFlag);
- if(pGridWin[SC_SPLIT_BOTTOMLEFT]!=nullptr)
- pGridWin[SC_SPLIT_BOTTOMLEFT]->EnableInput(bFlag,false);
- if(pGridWin[SC_SPLIT_BOTTOMRIGHT]!=nullptr)
- pGridWin[SC_SPLIT_BOTTOMRIGHT]->EnableInput(bFlag,false);
- if(pGridWin[SC_SPLIT_TOPLEFT]!=nullptr)
- pGridWin[SC_SPLIT_TOPLEFT]->EnableInput(bFlag,false);
- if(pGridWin[SC_SPLIT_TOPRIGHT]!=nullptr)
- pGridWin[SC_SPLIT_TOPRIGHT]->EnableInput(bFlag,false);
- if(pColBar[SC_SPLIT_RIGHT]!=nullptr)
- pColBar[SC_SPLIT_RIGHT]->EnableInput(bFlag,false);
- if(pRowBar[SC_SPLIT_TOP]!=nullptr)
- pRowBar[SC_SPLIT_TOP]->EnableInput(bFlag,false);
+ for (auto& p : pGridWin)
+ if (p)
+ p->EnableInput(bFlag, false);
+ for (auto& p : pColBar)
+ if (p)
+ p->EnableInput(bFlag, false);
+ for (auto& p : pRowBar)
+ if (p)
+ p->EnableInput(bFlag, false);
}
bool ScTabView::ContinueOnlineSpelling()
More information about the Libreoffice-commits
mailing list