parent
1c79122ff6
commit
0f5889b089
@ -1,357 +0,0 @@
|
||||
From 153993292cc9f11fed8fcba8de45b0c46d5e0ef2 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Stahl <mstahl@redhat.com>
|
||||
Date: Thu, 27 Feb 2014 23:48:59 +0100
|
||||
Subject: [PATCH] RTF import: fix spurious page breaks at doc end (related:
|
||||
rhbz#1065629)
|
||||
|
||||
When a document ends with \sect it's possible that a spurious page break
|
||||
is created. In fact the spurious page break is always created by the
|
||||
RTF importer, sometimes it is deleted again by
|
||||
DomainMapper_Impl::RemoveLastParagraph() and sometimes not.
|
||||
|
||||
It is created because on the final \sect RTFDocumentImpl::sectBreak()
|
||||
still calls startSectionGroup(), and the popState() for the \rtf1 group
|
||||
then calls sectBreak() another time.
|
||||
|
||||
To prevent this, do not call startSectionGroup() from sectBreak() but
|
||||
instead from setNeedSect(), and ensure that it is called as soon as
|
||||
anything after \sect is read.
|
||||
|
||||
One unit test fails because the \page is not handled properly: the
|
||||
conversion to \skbpage \sect \skbnone is not correct, because the \skb*
|
||||
keywords are an exception and affect the \sect that precedes them, not
|
||||
the following one; sending the \skbpage later unfortunately requires
|
||||
additional cleanup later.
|
||||
|
||||
(cherry picked from commit e3f254ab8211fbab7541cde2100a35c875b0c240)
|
||||
|
||||
RTF import: add unit test for page break in continuous section
|
||||
|
||||
(cherry picked from commit f03218f43e8c25c2e136d364455f3cdaf95362b6)
|
||||
|
||||
RTF import: fix paragraphs in header/footer
|
||||
|
||||
(cherry picked from commit 74b3f4f00766d199df3b017d056cf7a00ae52988)
|
||||
|
||||
Change-Id: I3c1a3bceb2c8b75bbecdc748170562451ce5f5c3
|
||||
Reviewed-on: https://gerrit.libreoffice.org/8439
|
||||
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
|
||||
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
|
||||
---
|
||||
.../rtfimport/data/cont-section-pagebreak.rtf | 16 +++++
|
||||
sw/qa/extras/rtfimport/data/footer-para.rtf | 5 ++
|
||||
sw/qa/extras/rtfimport/rtfimport.cxx | 42 +++++++++++++
|
||||
writerfilter/source/rtftok/rtfdocumentimpl.cxx | 71 +++++++++++++++-------
|
||||
writerfilter/source/rtftok/rtfdocumentimpl.hxx | 3 +
|
||||
5 files changed, 116 insertions(+), 21 deletions(-)
|
||||
create mode 100644 sw/qa/extras/rtfimport/data/cont-section-pagebreak.rtf
|
||||
create mode 100644 sw/qa/extras/rtfimport/data/footer-para.rtf
|
||||
|
||||
diff --git a/sw/qa/extras/rtfimport/data/cont-section-pagebreak.rtf b/sw/qa/extras/rtfimport/data/cont-section-pagebreak.rtf
|
||||
new file mode 100644
|
||||
index 0000000..888dc2d
|
||||
--- /dev/null
|
||||
+++ b/sw/qa/extras/rtfimport/data/cont-section-pagebreak.rtf
|
||||
@@ -0,0 +1,16 @@
|
||||
+{\rtf1 \ansi
|
||||
+\fet0 \ftnbj \paperw11905 \paperh16837 \margt2267 \margb1133 \margl1417 \margr1417
|
||||
+
|
||||
+\sectd
|
||||
+\sbknone
|
||||
+FIRST
|
||||
+\par
|
||||
+\sect
|
||||
+SECOND
|
||||
+\par
|
||||
+\page
|
||||
+\sect
|
||||
+THIRD
|
||||
+\par
|
||||
+\sect
|
||||
+}
|
||||
diff --git a/sw/qa/extras/rtfimport/data/footer-para.rtf b/sw/qa/extras/rtfimport/data/footer-para.rtf
|
||||
new file mode 100644
|
||||
index 0000000..28863b2
|
||||
--- /dev/null
|
||||
+++ b/sw/qa/extras/rtfimport/data/footer-para.rtf
|
||||
@@ -0,0 +1,5 @@
|
||||
+{\rtf1\fbidis\ansi\ansicpg0\uc0\deff0\deflang0\deflangfe0\paperw11905\paperh16838\margl1200\margr1200\margt1200\margb1200\headery600\footery600\viewscale100\viewzk0\titlepg
|
||||
+{\fonttbl{\f0\fnil Arial;}}
|
||||
+{\footerf
|
||||
+\pard\s0\fi0\li0\qc\ri0\sb0\sa0\itap0 \plain \f0\fs18 All Rights Reserved.\par}
|
||||
+\pard\par}
|
||||
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
|
||||
index 9504027..73bf749 100644
|
||||
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
|
||||
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <com/sun/star/drawing/LineStyle.hpp>
|
||||
#include <com/sun/star/graphic/GraphicType.hpp>
|
||||
#include <com/sun/star/lang/XServiceInfo.hpp>
|
||||
+#include <com/sun/star/style/BreakType.hpp>
|
||||
#include <com/sun/star/style/CaseMap.hpp>
|
||||
#include <com/sun/star/style/LineSpacing.hpp>
|
||||
#include <com/sun/star/style/LineSpacingMode.hpp>
|
||||
@@ -1413,6 +1414,47 @@ DECLARE_RTFIMPORT_TEST(testNestedTable, "rhbz1065629.rtf")
|
||||
getProperty<table::BorderLine2>(xCell, "RightBorder"));
|
||||
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0xffffffff),
|
||||
getProperty<sal_Int32>(xCell, "BackColor"));
|
||||
+
|
||||
+ // \sect at the end resulted in spurious page break
|
||||
+ CPPUNIT_ASSERT_EQUAL(1, getPages());
|
||||
+}
|
||||
+
|
||||
+DECLARE_RTFIMPORT_TEST(testContSectionPageBreak, "cont-section-pagebreak.rtf")
|
||||
+{
|
||||
+ uno::Reference<text::XTextRange> xParaSecond = getParagraph(2);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("SECOND"), xParaSecond->getString());
|
||||
+ CPPUNIT_ASSERT_EQUAL(style::BreakType_NONE,
|
||||
+ getProperty<style::BreakType>(xParaSecond, "BreakType"));
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(""),
|
||||
+ getProperty<OUString>(xParaSecond, "PageDescName"));
|
||||
+ // actually not sure how many paragraph there should be between
|
||||
+ // SECOND and THIRD - important is that the page break is on there
|
||||
+ uno::Reference<text::XTextRange> xParaNext = getParagraph(3);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(""), xParaNext->getString());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("Converted1"),
|
||||
+ getProperty<OUString>(xParaNext, "PageDescName"));
|
||||
+ uno::Reference<text::XTextRange> xParaThird = getParagraph(4);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("THIRD"), xParaThird->getString());
|
||||
+ CPPUNIT_ASSERT_EQUAL(style::BreakType_NONE,
|
||||
+ getProperty<style::BreakType>(xParaThird, "BreakType"));
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(""),
|
||||
+ getProperty<OUString>(xParaThird, "PageDescName"));
|
||||
+
|
||||
+ CPPUNIT_ASSERT_EQUAL(2, getPages());
|
||||
+}
|
||||
+
|
||||
+DECLARE_RTFIMPORT_TEST(testFooterPara, "footer-para.rtf")
|
||||
+{
|
||||
+ // check that paragraph properties in footer are imported
|
||||
+ uno::Reference<text::XText> xFooterText =
|
||||
+ getProperty< uno::Reference<text::XText> >(
|
||||
+ getStyles("PageStyles")->getByName("First Page"), "FooterText");
|
||||
+ uno::Reference<text::XTextContent> xParagraph =
|
||||
+ getParagraphOrTable(1, xFooterText);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("All Rights Reserved."),
|
||||
+ uno::Reference<text::XTextRange>(xParagraph, uno::UNO_QUERY)->getString());
|
||||
+ CPPUNIT_ASSERT_EQUAL((sal_Int16)style::ParagraphAdjust_CENTER,
|
||||
+ getProperty</*style::ParagraphAdjust*/sal_Int16>(xParagraph, "ParaAdjust"));
|
||||
}
|
||||
|
||||
DECLARE_RTFIMPORT_TEST(testCp1000016, "hello.rtf")
|
||||
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
|
||||
index d5e7843..0dc20b0 100644
|
||||
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
|
||||
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
|
||||
@@ -279,7 +279,8 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x
|
||||
m_aHexBuffer(),
|
||||
m_bMathNor(false),
|
||||
m_bIgnoreNextContSectBreak(false),
|
||||
- m_bNeedSect(true),
|
||||
+ m_nResetBreakOnSectBreak(static_cast<RTFKeyword>(-1)),
|
||||
+ m_bNeedSect(false), // done by checkFirstRun
|
||||
m_bWasInFrame(false),
|
||||
m_bHadPicture(false),
|
||||
m_bHadSect(false),
|
||||
@@ -392,16 +393,15 @@ void RTFDocumentImpl::checkFirstRun()
|
||||
writerfilter::Reference<Table>::Pointer_t const pTable(new RTFReferenceTable(aSettingsTableEntries));
|
||||
Mapper().table(NS_ooxml::LN_settings_settings, pTable);
|
||||
// start initial paragraph
|
||||
- if (!m_pSuperstream)
|
||||
- Mapper().startSectionGroup();
|
||||
- Mapper().startParagraphGroup();
|
||||
+ m_bFirstRun = false;
|
||||
+ assert(!m_bNeedSect);
|
||||
+ setNeedSect(); // first call that succeeds
|
||||
|
||||
// set the requested default font, if there are none
|
||||
RTFValue::Pointer_t pFont = m_aDefaultState.aCharacterSprms.find(NS_sprm::LN_CRgFtc0);
|
||||
RTFValue::Pointer_t pCurrentFont = m_aStates.top().aCharacterSprms.find(NS_sprm::LN_CRgFtc0);
|
||||
if (pFont && !pCurrentFont)
|
||||
dispatchValue(RTF_F, pFont->getInt());
|
||||
- m_bFirstRun = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -417,7 +417,22 @@ void RTFDocumentImpl::setNeedPar(bool bNeedPar)
|
||||
|
||||
void RTFDocumentImpl::setNeedSect(bool bNeedSect)
|
||||
{
|
||||
- m_bNeedSect = bNeedSect;
|
||||
+ // ignore setting before checkFirstRun - every keyword calls setNeedSect!
|
||||
+ if (!m_bNeedSect && bNeedSect && !m_bFirstRun)
|
||||
+ {
|
||||
+ if (!m_pSuperstream) // no sections in header/footer!
|
||||
+ {
|
||||
+ Mapper().startSectionGroup();
|
||||
+ }
|
||||
+ // set flag in substream too - otherwise multiple startParagraphGroup
|
||||
+ m_bNeedSect = bNeedSect;
|
||||
+ Mapper().startParagraphGroup();
|
||||
+ setNeedPar(true);
|
||||
+ }
|
||||
+ else if (m_bNeedSect && !bNeedSect)
|
||||
+ {
|
||||
+ m_bNeedSect = bNeedSect;
|
||||
+ }
|
||||
}
|
||||
|
||||
writerfilter::Reference<Properties>::Pointer_t RTFDocumentImpl::getProperties(RTFSprms& rAttributes, RTFSprms& rSprms)
|
||||
@@ -542,6 +557,7 @@ void RTFDocumentImpl::sectBreak(bool bFinal = false)
|
||||
{
|
||||
dispatchFlag(RTF_PARD);
|
||||
dispatchSymbol(RTF_PAR);
|
||||
+ m_bNeedSect = bNeedSect;
|
||||
}
|
||||
while (!m_nHeaderFooterPositions.empty())
|
||||
{
|
||||
@@ -572,12 +588,7 @@ void RTFDocumentImpl::sectBreak(bool bFinal = false)
|
||||
Mapper().endParagraphGroup();
|
||||
if (!m_pSuperstream)
|
||||
Mapper().endSectionGroup();
|
||||
- if (!bFinal)
|
||||
- {
|
||||
- Mapper().startSectionGroup();
|
||||
- Mapper().startParagraphGroup();
|
||||
- }
|
||||
- m_bNeedPar = true;
|
||||
+ m_bNeedPar = false;
|
||||
m_bNeedSect = false;
|
||||
}
|
||||
|
||||
@@ -1345,8 +1356,8 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer,
|
||||
|
||||
int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
|
||||
{
|
||||
- checkUnicode(/*bUnicode =*/ true, /*bHex =*/ true);
|
||||
setNeedSect();
|
||||
+ checkUnicode(/*bUnicode =*/ true, /*bHex =*/ true);
|
||||
RTFSkipDestination aSkip(*this);
|
||||
switch (nKeyword)
|
||||
{
|
||||
@@ -1867,11 +1878,11 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
|
||||
|
||||
int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
|
||||
{
|
||||
+ setNeedSect();
|
||||
if (nKeyword != RTF_HEXCHAR)
|
||||
checkUnicode(/*bUnicode =*/ true, /*bHex =*/ true);
|
||||
else
|
||||
checkUnicode(/*bUnicode =*/ true, /*bHex =*/ false);
|
||||
- setNeedSect();
|
||||
RTFSkipDestination aSkip(*this);
|
||||
|
||||
if (RTF_LINE == nKeyword)
|
||||
@@ -1944,7 +1955,15 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
|
||||
if (m_bIgnoreNextContSectBreak)
|
||||
m_bIgnoreNextContSectBreak = false;
|
||||
else
|
||||
+ {
|
||||
sectBreak();
|
||||
+ if (m_nResetBreakOnSectBreak != -1)
|
||||
+ { // this should run on _second_ \sect after \page
|
||||
+ dispatchSymbol(m_nResetBreakOnSectBreak); // lazy reset
|
||||
+ m_nResetBreakOnSectBreak = static_cast<RTFKeyword>(-1);
|
||||
+ m_bNeedSect = false; // dispatchSymbol set it
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
break;
|
||||
case RTF_NOBREAK:
|
||||
@@ -2116,19 +2135,24 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
|
||||
RTFValue::Pointer_t pBreak = m_aStates.top().aSectionSprms.find(NS_sprm::LN_SBkc);
|
||||
// Unless we're on a title page.
|
||||
RTFValue::Pointer_t pTitlePg = m_aStates.top().aSectionSprms.find(NS_ooxml::LN_EG_SectPrContents_titlePg);
|
||||
- if ((pBreak.get() && !pBreak->getInt()) && !(pTitlePg.get() && pTitlePg->getInt()))
|
||||
+ if (((pBreak.get() && !pBreak->getInt())
|
||||
+ || m_nResetBreakOnSectBreak == RTF_SBKNONE)
|
||||
+ && !(pTitlePg.get() && pTitlePg->getInt()))
|
||||
{
|
||||
if (m_bWasInFrame)
|
||||
{
|
||||
dispatchSymbol(RTF_PAR);
|
||||
m_bWasInFrame = false;
|
||||
}
|
||||
- dispatchFlag(RTF_SBKPAGE);
|
||||
sectBreak();
|
||||
- dispatchFlag(RTF_SBKNONE);
|
||||
+ // note: this will not affect the following section break
|
||||
+ // but the one just pushed
|
||||
+ dispatchFlag(RTF_SBKPAGE);
|
||||
if (m_bNeedPar)
|
||||
dispatchSymbol(RTF_PAR);
|
||||
m_bIgnoreNextContSectBreak = true;
|
||||
+ // arrange to clean up the syntetic RTF_SBKPAGE
|
||||
+ m_nResetBreakOnSectBreak = RTF_SBKNONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2162,8 +2186,8 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
|
||||
|
||||
int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword)
|
||||
{
|
||||
- checkUnicode(/*bUnicode =*/ true, /*bHex =*/ true);
|
||||
setNeedSect();
|
||||
+ checkUnicode(/*bUnicode =*/ true, /*bHex =*/ true);
|
||||
RTFSkipDestination aSkip(*this);
|
||||
int nParam = -1;
|
||||
int nSprm = -1;
|
||||
@@ -2295,6 +2319,10 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword)
|
||||
}
|
||||
if (nParam >= 0)
|
||||
{
|
||||
+ if (m_nResetBreakOnSectBreak != -1)
|
||||
+ {
|
||||
+ m_nResetBreakOnSectBreak = nKeyword;
|
||||
+ }
|
||||
RTFValue::Pointer_t pValue(new RTFValue(nParam));
|
||||
m_aStates.top().aSectionSprms.set(NS_sprm::LN_SBkc, pValue);
|
||||
return 0;
|
||||
@@ -2902,8 +2930,8 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword)
|
||||
|
||||
int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
|
||||
{
|
||||
- checkUnicode(/*bUnicode =*/ nKeyword != RTF_U, /*bHex =*/ true);
|
||||
setNeedSect();
|
||||
+ checkUnicode(/*bUnicode =*/ nKeyword != RTF_U, /*bHex =*/ true);
|
||||
RTFSkipDestination aSkip(*this);
|
||||
int nSprm = 0;
|
||||
RTFValue::Pointer_t pIntValue(new RTFValue(nParam));
|
||||
@@ -3869,8 +3897,8 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
|
||||
|
||||
int RTFDocumentImpl::dispatchToggle(RTFKeyword nKeyword, bool bParam, int nParam)
|
||||
{
|
||||
- checkUnicode(/*bUnicode =*/ true, /*bHex =*/ true);
|
||||
setNeedSect();
|
||||
+ checkUnicode(/*bUnicode =*/ true, /*bHex =*/ true);
|
||||
RTFSkipDestination aSkip(*this);
|
||||
int nSprm = -1;
|
||||
RTFValue::Pointer_t pBoolValue(new RTFValue(!bParam || nParam != 0));
|
||||
@@ -4721,7 +4749,8 @@ int RTFDocumentImpl::popState()
|
||||
// not in case of other substreams, like headers.
|
||||
if (m_bNeedCr && !(m_nStreamType == NS_rtf::LN_footnote || m_nStreamType == NS_rtf::LN_endnote))
|
||||
dispatchSymbol(RTF_PAR);
|
||||
- sectBreak(true);
|
||||
+ if (m_bNeedSect) // may be set by dispatchSymbol above!
|
||||
+ sectBreak(true);
|
||||
}
|
||||
|
||||
m_aStates.pop();
|
||||
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
|
||||
index 932ec46..fa1f3d6 100644
|
||||
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
|
||||
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
|
||||
@@ -524,6 +524,9 @@ namespace writerfilter {
|
||||
bool m_bMathNor;
|
||||
/// If the next continous section break should be ignored.
|
||||
bool m_bIgnoreNextContSectBreak;
|
||||
+ /// clean up a synthetic page break, see RTF_PAGE
|
||||
+ /// if inactive value is -1, otherwise the RTF_SKB* to restore
|
||||
+ RTFKeyword m_nResetBreakOnSectBreak;
|
||||
/// If a section break is needed before the end of the doc (false right after a section break).
|
||||
bool m_bNeedSect;
|
||||
/// If aFrame.inFrame() was true in the previous state.
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,168 +0,0 @@
|
||||
From dfd483bf9ab7fad58882fb2abff5cbf7f79a4e37 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
||||
Date: Fri, 28 Feb 2014 16:55:03 +0000
|
||||
Subject: [PATCH] Resolves: rhbz#1007697 Update on a Window triggering delete
|
||||
on window
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Reviewed-on: https://gerrit.libreoffice.org/8396
|
||||
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
|
||||
Tested-by: Caolán McNamara <caolanm@redhat.com>
|
||||
(cherry picked from commit 1ec2880679d88c89901ce00fe30dd78e584f6960)
|
||||
|
||||
Conflicts:
|
||||
svx/source/svdraw/sdrpaintwindow.cxx
|
||||
vcl/source/window/window.cxx
|
||||
|
||||
Change-Id: Ic6374ce45e3a3ba97217ae77e91f9143f46e277b
|
||||
---
|
||||
svx/source/svdraw/sdrpaintwindow.cxx | 96 +++++++++++++++++++++++++++++-------
|
||||
vcl/source/window/window.cxx | 5 ++
|
||||
2 files changed, 83 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/svx/source/svdraw/sdrpaintwindow.cxx b/svx/source/svdraw/sdrpaintwindow.cxx
|
||||
index 6abacc5..81dff0b 100644
|
||||
--- a/svx/source/svdraw/sdrpaintwindow.cxx
|
||||
+++ b/svx/source/svdraw/sdrpaintwindow.cxx
|
||||
@@ -22,35 +22,95 @@
|
||||
#include <svx/svdpntv.hxx>
|
||||
#include <vcl/gdimtf.hxx>
|
||||
#include <vcl/svapp.hxx>
|
||||
+#include <set>
|
||||
+#include <vector>
|
||||
+
|
||||
+//rhbz#1007697 do this in two loops, one to collect the candidates
|
||||
+//and another to update them because updating a candidate can
|
||||
+//trigger the candidate to be deleted, so asking for its
|
||||
+//sibling after that is going to fail hard
|
||||
+class CandidateMgr
|
||||
+{
|
||||
+ std::vector<Window*> m_aCandidates;
|
||||
+ std::set<Window*> m_aDeletedCandidates;
|
||||
+ DECL_LINK(WindowEventListener, VclSimpleEvent*);
|
||||
+public:
|
||||
+ void PaintTransparentChildren(Window & rWindow, Rectangle const& rPixelRect);
|
||||
+ ~CandidateMgr();
|
||||
+};
|
||||
+
|
||||
+IMPL_LINK(CandidateMgr, WindowEventListener, VclSimpleEvent*, pEvent)
|
||||
+{
|
||||
+ VclWindowEvent* pWinEvent = dynamic_cast< VclWindowEvent* >( pEvent );
|
||||
+ if (pWinEvent)
|
||||
+ {
|
||||
+ Window* pWindow = pWinEvent->GetWindow();
|
||||
+ if (pWinEvent->GetId() == VCLEVENT_OBJECT_DYING)
|
||||
+ {
|
||||
+ m_aDeletedCandidates.insert(pWindow);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+CandidateMgr::~CandidateMgr()
|
||||
+{
|
||||
+ for (std::vector<Window*>::iterator aI = m_aCandidates.begin();
|
||||
+ aI != m_aCandidates.end(); ++aI)
|
||||
+ {
|
||||
+ Window* pCandidate = *aI;
|
||||
+ if (m_aDeletedCandidates.find(pCandidate) != m_aDeletedCandidates.end())
|
||||
+ continue;
|
||||
+ pCandidate->RemoveEventListener(LINK(this, CandidateMgr, WindowEventListener));
|
||||
+ }
|
||||
+}
|
||||
|
||||
void PaintTransparentChildren(Window & rWindow, Rectangle const& rPixelRect)
|
||||
{
|
||||
- if (rWindow.IsChildTransparentModeEnabled())
|
||||
+ if (!rWindow.IsChildTransparentModeEnabled())
|
||||
+ return;
|
||||
+
|
||||
+ CandidateMgr aManager;
|
||||
+ aManager.PaintTransparentChildren(rWindow, rPixelRect);
|
||||
+}
|
||||
+
|
||||
+void CandidateMgr::PaintTransparentChildren(Window & rWindow, Rectangle const& rPixelRect)
|
||||
+{
|
||||
+ Window * pCandidate = rWindow.GetWindow( WINDOW_FIRSTCHILD );
|
||||
+ while (pCandidate)
|
||||
{
|
||||
- Window * pCandidate = rWindow.GetWindow( WINDOW_FIRSTCHILD );
|
||||
- while (pCandidate)
|
||||
+ if (pCandidate->IsPaintTransparent())
|
||||
{
|
||||
- if (pCandidate->IsPaintTransparent())
|
||||
+ const Rectangle aCandidatePosSizePixel(
|
||||
+ pCandidate->GetPosPixel(),
|
||||
+ pCandidate->GetSizePixel());
|
||||
+
|
||||
+ if (aCandidatePosSizePixel.IsOver(rPixelRect))
|
||||
{
|
||||
- const Rectangle aCandidatePosSizePixel(
|
||||
- pCandidate->GetPosPixel(),
|
||||
- pCandidate->GetSizePixel());
|
||||
-
|
||||
- if (aCandidatePosSizePixel.IsOver(rPixelRect))
|
||||
- {
|
||||
- pCandidate->Invalidate(
|
||||
- INVALIDATE_NOTRANSPARENT|INVALIDATE_CHILDREN );
|
||||
- // important: actually paint the child here!
|
||||
- pCandidate->Update();
|
||||
- }
|
||||
+ m_aCandidates.push_back(pCandidate);
|
||||
+ pCandidate->AddEventListener(LINK(this, CandidateMgr, WindowEventListener));
|
||||
}
|
||||
- pCandidate = pCandidate->GetWindow( WINDOW_NEXT );
|
||||
}
|
||||
+ pCandidate = pCandidate->GetWindow( WINDOW_NEXT );
|
||||
}
|
||||
-}
|
||||
|
||||
-////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
+ for (std::vector<Window*>::iterator aI = m_aCandidates.begin();
|
||||
+ aI != m_aCandidates.end(); ++aI)
|
||||
+ {
|
||||
+ pCandidate = *aI;
|
||||
+ if (m_aDeletedCandidates.find(pCandidate) != m_aDeletedCandidates.end())
|
||||
+ continue;
|
||||
+ //rhbz#1007697 this can cause the window itself to be
|
||||
+ //deleted. So we are listening to see if that happens
|
||||
+ //and if so, then skip the update
|
||||
+ pCandidate->Invalidate(INVALIDATE_NOTRANSPARENT|INVALIDATE_CHILDREN);
|
||||
+ // important: actually paint the child here!
|
||||
+ if (m_aDeletedCandidates.find(pCandidate) != m_aDeletedCandidates.end())
|
||||
+ continue;
|
||||
+ pCandidate->Update();
|
||||
+ }
|
||||
+}
|
||||
|
||||
SdrPreRenderDevice::SdrPreRenderDevice(OutputDevice& rOriginal)
|
||||
: mrOutputDevice(rOriginal)
|
||||
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
|
||||
index 1ef62c1..60a14f1 100644
|
||||
--- a/vcl/source/window/window.cxx
|
||||
+++ b/vcl/source/window/window.cxx
|
||||
@@ -7561,6 +7561,8 @@ void Window::Update()
|
||||
// if there is something to paint, trigger a Paint
|
||||
if ( pUpdateWindow->mpWindowImpl->mnPaintFlags & (IMPL_PAINT_PAINT | IMPL_PAINT_PAINTCHILDREN) )
|
||||
{
|
||||
+ ImplDelData aDogTag(this);
|
||||
+
|
||||
// trigger an update also for system windows on top of us,
|
||||
// otherwise holes would remain
|
||||
Window* pUpdateOverlapWindow = ImplGetFirstOverlapWindow()->mpWindowImpl->mpFirstOverlap;
|
||||
@@ -7571,6 +7573,9 @@ void Window::Update()
|
||||
}
|
||||
|
||||
pUpdateWindow->ImplCallPaint( NULL, pUpdateWindow->mpWindowImpl->mnPaintFlags );
|
||||
+
|
||||
+ if (aDogTag.IsDead())
|
||||
+ return;
|
||||
bFlush = sal_True;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.5.3
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 02efbed152a3a9e364cdb73628af0aed0f5d6f7a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
||||
Date: Wed, 4 Dec 2013 16:48:08 +0000
|
||||
Subject: [PATCH] Resolves: rhbz#1038189 refresh printer list when print dialog
|
||||
launched
|
||||
|
||||
which is the the same thing the printer settings dialog does
|
||||
|
||||
Change-Id: I36fb9f057b66faa8c9fce5a9934ed2fb70786363
|
||||
---
|
||||
vcl/source/window/printdlg.cxx | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx
|
||||
index b8cb188..21941ca 100644
|
||||
--- a/vcl/source/window/printdlg.cxx
|
||||
+++ b/vcl/source/window/printdlg.cxx
|
||||
@@ -602,6 +602,8 @@ PrintDialog::PrintDialog( Window* i_pParent, const boost::shared_ptr<PrinterCont
|
||||
// init reverse print
|
||||
maJobPage.mpReverseOrderBox->Check( maPController->getReversePrint() );
|
||||
|
||||
+ Printer::updatePrinters();
|
||||
+
|
||||
// fill printer listbox
|
||||
const std::vector< OUString >& rQueues( Printer::GetPrinterQueues() );
|
||||
for( std::vector< OUString >::const_iterator it = rQueues.begin();
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,72 +0,0 @@
|
||||
From b071644756772d0b6930ac2e6d27237b67e7febc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= <tamas.zolnai@collabora.com>
|
||||
Date: Fri, 7 Mar 2014 10:57:52 +0100
|
||||
Subject: [PATCH 1/2] fdo#74787, rhbz#1072553: Fix deselection problems of
|
||||
template view
|
||||
|
||||
deselectItems() were added to make recent docs
|
||||
view work, but it is unneccessary to
|
||||
affect template view too.
|
||||
|
||||
(regression from 0314034d8b23d5b69399cfcdf6b2f2add73f9f47)
|
||||
|
||||
Conflicts:
|
||||
sfx2/source/control/recentdocsview.cxx
|
||||
|
||||
Change-Id: I0c805774321939991e308e9c8c669604e81dbad5
|
||||
Reviewed-on: https://gerrit.libreoffice.org/8490
|
||||
Tested-by: Michael Stahl <mstahl@redhat.com>
|
||||
Reviewed-by: Michael Stahl <mstahl@redhat.com>
|
||||
---
|
||||
include/sfx2/recentdocsview.hxx | 2 ++
|
||||
sfx2/source/control/recentdocsview.cxx | 7 +++++++
|
||||
sfx2/source/control/thumbnailview.cxx | 2 --
|
||||
3 files changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/include/sfx2/recentdocsview.hxx b/include/sfx2/recentdocsview.hxx
|
||||
index 1706935..d9ad72d 100644
|
||||
--- a/include/sfx2/recentdocsview.hxx
|
||||
+++ b/include/sfx2/recentdocsview.hxx
|
||||
@@ -66,6 +66,8 @@ protected:
|
||||
void OpenItem( const ThumbnailViewItem *pItem );
|
||||
virtual void Paint( const Rectangle& rRect );
|
||||
|
||||
+ virtual void LoseFocus();
|
||||
+
|
||||
bool isAcceptedFile(const OUString &rURL) const;
|
||||
|
||||
long mnItemMaxSize;
|
||||
diff --git a/sfx2/source/control/recentdocsview.cxx b/sfx2/source/control/recentdocsview.cxx
|
||||
index e462172..13f7dc3 100644
|
||||
--- a/sfx2/source/control/recentdocsview.cxx
|
||||
+++ b/sfx2/source/control/recentdocsview.cxx
|
||||
@@ -302,6 +302,13 @@ void RecentDocsView::Paint( const Rectangle &aRect )
|
||||
ThumbnailView::Paint(aRect);
|
||||
}
|
||||
|
||||
+void RecentDocsView::LoseFocus()
|
||||
+{
|
||||
+ deselectItems();
|
||||
+
|
||||
+ ThumbnailView::LoseFocus();
|
||||
+}
|
||||
+
|
||||
void RecentDocsView::SetThumbnailSize(long thumbnailSize)
|
||||
{
|
||||
mnItemMaxSize = thumbnailSize;
|
||||
diff --git a/sfx2/source/control/thumbnailview.cxx b/sfx2/source/control/thumbnailview.cxx
|
||||
index 3c6d094..a4e38a7 100644
|
||||
--- a/sfx2/source/control/thumbnailview.cxx
|
||||
+++ b/sfx2/source/control/thumbnailview.cxx
|
||||
@@ -918,8 +918,6 @@ void ThumbnailView::GetFocus()
|
||||
|
||||
void ThumbnailView::LoseFocus()
|
||||
{
|
||||
- deselectItems();
|
||||
-
|
||||
Control::LoseFocus();
|
||||
|
||||
// Tell the accessible object that we lost the focus.
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,139 +0,0 @@
|
||||
From 34c72f10939d473eb1a098fac1f05647c0232727 Mon Sep 17 00:00:00 2001
|
||||
From: Stephan Bergmann <sbergman@redhat.com>
|
||||
Date: Thu, 27 Feb 2014 13:18:36 +0100
|
||||
Subject: [PATCH] fdo#75540 setProcessServiceFactory must be called before
|
||||
InitVCL
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
...because InitVCL now calls:
|
||||
|
||||
> comphelper::getProcessServiceFactory
|
||||
> comphelper::getProcessComponentContext
|
||||
> utl::DefaultFontConfiguration::DefaultFontConfiguration
|
||||
> rtl::Static<utl::DefaultFontConfiguration, (anonymous namespace)::theDefaultFontConfiguration>::get
|
||||
> utl::DefaultFontConfiguration::get
|
||||
> ImplStyleData::SetStandardStyles
|
||||
> ImplStyleData::ImplStyleData
|
||||
> boost::make_shared<ImplStyleData>
|
||||
> StyleSettings::StyleSettings
|
||||
> ImplAllSettingsData::ImplAllSettingsData
|
||||
> boost::make_shared<ImplAllSettingsData>
|
||||
> AllSettings::AllSettings
|
||||
> Application::InitSettings
|
||||
> Application::GetSettings
|
||||
> GtkInstance::AfterAppInit
|
||||
> InitVCL
|
||||
> ImplSVMain
|
||||
> SVMain
|
||||
> sal_main
|
||||
> main
|
||||
|
||||
and Application::Main is only called after InitVCL.
|
||||
|
||||
(cherry picked from commit c828e3cc409077a1916911b8abf1d7b8dbb2078a)
|
||||
Conflicts:
|
||||
padmin/source/pamain.cxx
|
||||
|
||||
Change-Id: I1126e33f454a4ea35ef295cbd3f48429c473efb4
|
||||
Reviewed-on: https://gerrit.libreoffice.org/8380
|
||||
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
|
||||
Tested-by: Caolán McNamara <caolanm@redhat.com>
|
||||
---
|
||||
padmin/source/pamain.cxx | 54 +++++++++++++++++++++++++++---------------------
|
||||
1 file changed, 30 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/padmin/source/pamain.cxx b/padmin/source/pamain.cxx
|
||||
index bbccadf..b510f99 100644
|
||||
--- a/padmin/source/pamain.cxx
|
||||
+++ b/padmin/source/pamain.cxx
|
||||
@@ -51,6 +51,11 @@ public:
|
||||
virtual sal_uInt16 Exception( sal_uInt16 nError );
|
||||
|
||||
static OUString ReadStringHook( const OUString& );
|
||||
+
|
||||
+private:
|
||||
+ virtual void Init() SAL_OVERRIDE;
|
||||
+
|
||||
+ Reference< XComponentContext > xCtx_;
|
||||
};
|
||||
|
||||
void vclmain::createApplication()
|
||||
@@ -84,35 +89,13 @@ int MyApp::Main()
|
||||
|
||||
EnableAutoHelpId();
|
||||
|
||||
- //-------------------------------------------------
|
||||
- // create the global service-manager
|
||||
- //-------------------------------------------------
|
||||
- Reference< XComponentContext > xCtx;
|
||||
- Reference< XMultiServiceFactory > xFactory;
|
||||
- try
|
||||
- {
|
||||
- xCtx = defaultBootstrap_InitialComponentContext();
|
||||
- xFactory = Reference< XMultiServiceFactory >( xCtx->getServiceManager(), UNO_QUERY );
|
||||
- if( xFactory.is() )
|
||||
- setProcessServiceFactory( xFactory );
|
||||
- }
|
||||
- catch( const com::sun::star::uno::Exception& )
|
||||
- {
|
||||
- }
|
||||
-
|
||||
- if( ! xFactory.is() )
|
||||
- {
|
||||
- fprintf( stderr, "Could not bootstrap UNO, installation must be in disorder. Exiting.\n" );
|
||||
- exit( 1 );
|
||||
- }
|
||||
-
|
||||
// Detect desktop environment - need to do this as early as possible
|
||||
com::sun::star::uno::setCurrentContext(
|
||||
new DesktopContext( com::sun::star::uno::getCurrentContext() ) );
|
||||
|
||||
// Create UCB (for backwards compatibility, in case some code still uses
|
||||
// plain createInstance w/o args directly to obtain an instance):
|
||||
- com::sun::star::ucb::UniversalContentBroker::create(xCtx);
|
||||
+ com::sun::star::ucb::UniversalContentBroker::create(xCtx_);
|
||||
|
||||
/*
|
||||
* Initialize the Java UNO AccessBridge if accessibility is turned on
|
||||
@@ -139,7 +122,7 @@ int MyApp::Main()
|
||||
*/
|
||||
try
|
||||
{
|
||||
- Reference<XComponent> xComp(xCtx, UNO_QUERY_THROW);
|
||||
+ Reference<XComponent> xComp(xCtx_, UNO_QUERY_THROW);
|
||||
xComp->dispose();
|
||||
}
|
||||
catch(...)
|
||||
@@ -149,4 +132,27 @@ int MyApp::Main()
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
+void MyApp::Init()
|
||||
+{
|
||||
+ // create the global service-manager
|
||||
+
|
||||
+ Reference< XMultiServiceFactory > xFactory;
|
||||
+ try
|
||||
+ {
|
||||
+ xCtx_ = defaultBootstrap_InitialComponentContext();
|
||||
+ xFactory = Reference< XMultiServiceFactory >( xCtx_->getServiceManager(), UNO_QUERY );
|
||||
+ if( xFactory.is() )
|
||||
+ setProcessServiceFactory( xFactory );
|
||||
+ }
|
||||
+ catch( const com::sun::star::uno::Exception& )
|
||||
+ {
|
||||
+ }
|
||||
+
|
||||
+ if( ! xFactory.is() )
|
||||
+ {
|
||||
+ fprintf( stderr, "Could not bootstrap UNO, installation must be in disorder. Exiting.\n" );
|
||||
+ exit( 1 );
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||
--
|
||||
1.8.5.3
|
||||
|
@ -1,51 +0,0 @@
|
||||
From 3ef19ef7c5de8db17c693e2db286f79efbd98d8d Mon Sep 17 00:00:00 2001
|
||||
From: Michael Stahl <mstahl@redhat.com>
|
||||
Date: Fri, 7 Mar 2014 15:56:37 +0100
|
||||
Subject: [PATCH] rhbz#1043551: sw: avoid division-by-0 in Text Grid painting
|
||||
code
|
||||
|
||||
Possible to trigger with a document containing:
|
||||
style:layout-grid-base-height="0cm"
|
||||
|
||||
(cherry picked from commit 71b55cf57460aec3fec948676251448934ba31d1)
|
||||
|
||||
got to love the sal_Int32 as long/int
|
||||
(cherry picked from commit 18c89ae6ff01f3d555a7cb030eb4572d504e8de7)
|
||||
|
||||
Change-Id: Id3bd1f29157b39e8a577be0b87b86236dbe5a50c
|
||||
---
|
||||
sw/source/core/layout/atrfrm.cxx | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx
|
||||
index b06cea4..3c40518 100644
|
||||
--- a/sw/source/core/layout/atrfrm.cxx
|
||||
+++ b/sw/source/core/layout/atrfrm.cxx
|
||||
@@ -2262,12 +2262,24 @@ bool SwTextGridItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
|
||||
bRet = (rVal >>= nTmp);
|
||||
nTmp = MM100_TO_TWIP( nTmp );
|
||||
if( bRet && (nTmp >= 0) && ( nTmp <= USHRT_MAX) )
|
||||
+ {
|
||||
+ // rhbz#1043551 round up to 5pt -- 0 causes divide-by-zero
|
||||
+ // in layout; 1pt ties the painting code up in knots for
|
||||
+ // minutes with bazillion lines...
|
||||
+#define MIN_TEXTGRID_SIZE 100
|
||||
if( (nMemberId & ~CONVERT_TWIPS) == MID_GRID_BASEHEIGHT )
|
||||
+ {
|
||||
+ nTmp = std::max<sal_Int32>(nTmp, MIN_TEXTGRID_SIZE);
|
||||
SetBaseHeight( (sal_uInt16)nTmp );
|
||||
+ }
|
||||
else if( (nMemberId & ~CONVERT_TWIPS) == MID_GRID_BASEWIDTH )
|
||||
+ {
|
||||
+ nTmp = std::max<sal_Int32>(nTmp, MIN_TEXTGRID_SIZE);
|
||||
SetBaseWidth( (sal_uInt16)nTmp );
|
||||
+ }
|
||||
else
|
||||
SetRubyHeight( (sal_uInt16)nTmp );
|
||||
+ }
|
||||
else
|
||||
bRet = false;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,39 +0,0 @@
|
||||
From 58d0ba47f82e264e9b17c0e0d37bc043126d195d Mon Sep 17 00:00:00 2001
|
||||
From: Michael Stahl <mstahl@redhat.com>
|
||||
Date: Thu, 6 Mar 2014 22:25:55 +0100
|
||||
Subject: [PATCH] rhbz#1072607: (hopefully) fix crash in SvxRuler::MouseMove()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Not sure why mpParaItem is 0 here, add a check like in every other
|
||||
SvxRuler method.
|
||||
|
||||
(regression from 47a77d7dbc427e51421e2df8d59695834cb74980)
|
||||
|
||||
Change-Id: Ic11a4d0c9b6ca217cd59d1d3f6789592996d2c1d
|
||||
(cherry picked from commit 958616a323b7fe6b42cd642394cd90a9cd82e7f9)
|
||||
Reviewed-on: https://gerrit.libreoffice.org/8492
|
||||
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
|
||||
Tested-by: Tomaž Vajngerl <quikee@gmail.com>
|
||||
---
|
||||
svx/source/dialog/svxruler.cxx | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/svx/source/dialog/svxruler.cxx b/svx/source/dialog/svxruler.cxx
|
||||
index a41d0e0..ca16c17 100644
|
||||
--- a/svx/source/dialog/svxruler.cxx
|
||||
+++ b/svx/source/dialog/svxruler.cxx
|
||||
@@ -580,6 +580,9 @@ void SvxRuler::MouseMove( const MouseEvent& rMEvt )
|
||||
{
|
||||
case RULER_TYPE_INDENT:
|
||||
{
|
||||
+ if (!mpParaItem.get())
|
||||
+ break;
|
||||
+
|
||||
long nIndex = aSelection.nAryPos + INDENT_GAP;
|
||||
|
||||
long nIndentValue = 0.0;
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,676 +0,0 @@
|
||||
From 50945ba67bf6dec66b1ed33011316e0fc9197572 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Stahl <mstahl@redhat.com>
|
||||
Date: Sat, 1 Mar 2014 22:05:51 +0100
|
||||
Subject: [PATCH] writerfilter: salvage a field parameter parsing train wreck
|
||||
|
||||
Field parameters get horribly maimed by lcl_ExtractParameter which
|
||||
clearly has never worked in its 7 years of existence (and looking at the
|
||||
inanity at the call sites makes one wonder what the author was smoking).
|
||||
|
||||
The format is actually quite annoying, since spaces between parameters
|
||||
are optional.
|
||||
|
||||
The old RTF filter was at least able to parse "PAGEREF bookmark" fields,
|
||||
so this fixes such regressions (related: rhbz#1065629).
|
||||
|
||||
(cherry picked from commit 3dc548476c7e88f7a67cc38daf622631a34e34dd)
|
||||
|
||||
Conflicts:
|
||||
writerfilter/source/dmapper/DomainMapper_Impl.cxx
|
||||
|
||||
Change-Id: I9b2e32c3c7264be0fc1077cb8fb3f1bc5c1955bb
|
||||
Reviewed-on: https://gerrit.libreoffice.org/8440
|
||||
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
|
||||
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
|
||||
---
|
||||
writerfilter/CppunitTest_writerfilter_misc.mk | 36 ++++
|
||||
writerfilter/Module_writerfilter.mk | 1 +
|
||||
writerfilter/qa/cppunittests/misc/misc.cxx | 162 ++++++++++++++++
|
||||
writerfilter/source/dmapper/DomainMapper_Impl.cxx | 224 +++++++++++++++-------
|
||||
writerfilter/source/dmapper/DomainMapper_Impl.hxx | 3 +-
|
||||
5 files changed, 356 insertions(+), 70 deletions(-)
|
||||
create mode 100644 writerfilter/CppunitTest_writerfilter_misc.mk
|
||||
create mode 100644 writerfilter/qa/cppunittests/misc/misc.cxx
|
||||
|
||||
diff --git a/writerfilter/CppunitTest_writerfilter_misc.mk b/writerfilter/CppunitTest_writerfilter_misc.mk
|
||||
new file mode 100644
|
||||
index 0000000..1cdcd80
|
||||
--- /dev/null
|
||||
+++ b/writerfilter/CppunitTest_writerfilter_misc.mk
|
||||
@@ -0,0 +1,36 @@
|
||||
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
|
||||
+#
|
||||
+# 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/.
|
||||
+#
|
||||
+
|
||||
+$(eval $(call gb_CppunitTest_CppunitTest,writerfilter_misc))
|
||||
+
|
||||
+$(eval $(call gb_CppunitTest_use_api,writerfilter_misc,\
|
||||
+ offapi \
|
||||
+ udkapi \
|
||||
+))
|
||||
+
|
||||
+$(eval $(call gb_CppunitTest_use_external,writerfilter_misc,boost_headers))
|
||||
+
|
||||
+$(eval $(call gb_CppunitTest_use_libraries,writerfilter_misc, \
|
||||
+ writerfilter \
|
||||
+ cppu \
|
||||
+ sal \
|
||||
+ $(gb_UWINAPI) \
|
||||
+))
|
||||
+
|
||||
+$(eval $(call gb_CppunitTest_set_include,writerfilter_misc, \
|
||||
+ $$(INCLUDE) \
|
||||
+ -I$(SRCDIR)/writerfilter/inc \
|
||||
+))
|
||||
+
|
||||
+$(eval $(call gb_CppunitTest_add_exception_objects,writerfilter_misc, \
|
||||
+ writerfilter/qa/cppunittests/misc/misc \
|
||||
+))
|
||||
+
|
||||
+
|
||||
+# vim: set noet sw=4 ts=4:
|
||||
diff --git a/writerfilter/Module_writerfilter.mk b/writerfilter/Module_writerfilter.mk
|
||||
index 783b6ca..2fcb9e6 100644
|
||||
--- a/writerfilter/Module_writerfilter.mk
|
||||
+++ b/writerfilter/Module_writerfilter.mk
|
||||
@@ -16,6 +16,7 @@ $(eval $(call gb_Module_add_targets,writerfilter,\
|
||||
|
||||
$(eval $(call gb_Module_add_slowcheck_targets,writerfilter,\
|
||||
CppunitTest_writerfilter_rtftok \
|
||||
+ CppunitTest_writerfilter_misc \
|
||||
))
|
||||
|
||||
# vim: set noet sw=4 ts=4:
|
||||
diff --git a/writerfilter/qa/cppunittests/misc/misc.cxx b/writerfilter/qa/cppunittests/misc/misc.cxx
|
||||
new file mode 100644
|
||||
index 0000000..f7031b4
|
||||
--- /dev/null
|
||||
+++ b/writerfilter/qa/cppunittests/misc/misc.cxx
|
||||
@@ -0,0 +1,162 @@
|
||||
+/* -*- 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/.
|
||||
+ */
|
||||
+
|
||||
+#include <limits>
|
||||
+#include <vector>
|
||||
+
|
||||
+#include <boost/tuple/tuple.hpp>
|
||||
+
|
||||
+#include <cppunit/TestAssert.h>
|
||||
+#include <cppunit/TestFixture.h>
|
||||
+#include <cppunit/extensions/HelperMacros.h>
|
||||
+#include <cppunit/plugin/TestPlugIn.h>
|
||||
+
|
||||
+#include <sal/types.h>
|
||||
+
|
||||
+#include <rtl/ustring.hxx>
|
||||
+
|
||||
+#include <WriterFilterDllApi.hxx>
|
||||
+
|
||||
+
|
||||
+using namespace std;
|
||||
+
|
||||
+
|
||||
+namespace writerfilter { namespace dmapper {
|
||||
+
|
||||
+SAL_DLLPUBLIC_IMPORT // export just for test
|
||||
+boost::tuple<OUString, vector<OUString>, vector<OUString> >
|
||||
+lcl_SplitFieldCommand(const OUString& rCommand);
|
||||
+
|
||||
+} }
|
||||
+
|
||||
+
|
||||
+namespace {
|
||||
+
|
||||
+class WriterfilterMiscTest
|
||||
+ : public ::CppUnit::TestFixture
|
||||
+{
|
||||
+public:
|
||||
+ virtual void setUp();
|
||||
+ virtual void tearDown();
|
||||
+
|
||||
+ void testFieldParameters();
|
||||
+
|
||||
+ CPPUNIT_TEST_SUITE(WriterfilterMiscTest);
|
||||
+ CPPUNIT_TEST(testFieldParameters);
|
||||
+ CPPUNIT_TEST_SUITE_END();
|
||||
+};
|
||||
+
|
||||
+void WriterfilterMiscTest::setUp()
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+void WriterfilterMiscTest::tearDown()
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+void WriterfilterMiscTest::testFieldParameters()
|
||||
+{
|
||||
+ using writerfilter::dmapper::lcl_SplitFieldCommand;
|
||||
+ boost::tuple<OUString, vector<OUString>, vector<OUString> > result;
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("PAGEREF last_page");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand(" PAGEREF last_page ");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("pageref last_page");
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("pageref \"last_page\"");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("\"PAGEREF\" \"last_page\" \"\" ");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("\"PAGEREF\"\"last_page\" ");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("PAGEREF\"last_page\" ");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("\"PAGEREF\"last_page \"\"");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("\"PAGEREF\"last_page \"\"");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("pageref \"last\\\\pa\\\"ge\"");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last\\pa\"ge"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("PAGEREF\"last_page\"\\*");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<2>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("\\*"), boost::get<2>(result)[0]);
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("PAGEREF last_page \\b foobar ");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<2>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("\\B"), boost::get<2>(result)[0]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("foobar"), boost::get<2>(result)[1]);
|
||||
+
|
||||
+ result = lcl_SplitFieldCommand("PAGEREF\\bfoobar\\A\"\"");
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
|
||||
+ CPPUNIT_ASSERT(boost::get<1>(result).empty());
|
||||
+ CPPUNIT_ASSERT_EQUAL(size_t(4), boost::get<2>(result).size());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("\\B"), boost::get<2>(result)[0]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("foobar"), boost::get<2>(result)[1]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("\\A"), boost::get<2>(result)[2]);
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<2>(result)[3]);
|
||||
+}
|
||||
+
|
||||
+CPPUNIT_TEST_SUITE_REGISTRATION(WriterfilterMiscTest);
|
||||
+
|
||||
+}
|
||||
+
|
||||
+CPPUNIT_PLUGIN_IMPLEMENT();
|
||||
+
|
||||
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
|
||||
index 6b9562b..c7302cf 100644
|
||||
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
|
||||
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
|
||||
@@ -66,6 +66,7 @@
|
||||
#include <ooxml/OOXMLFastTokens.hxx>
|
||||
|
||||
#include <map>
|
||||
+#include <boost/tuple/tuple.hpp>
|
||||
|
||||
#include <vcl/svapp.hxx>
|
||||
#include <vcl/outdev.hxx>
|
||||
@@ -2003,37 +2004,133 @@ OUString lcl_ParseFormat( const OUString& rCommand )
|
||||
/*-------------------------------------------------------------------------
|
||||
extract a parameter (with or without quotes) between the command and the following backslash
|
||||
-----------------------------------------------------------------------*/
|
||||
-OUString lcl_ExtractParameter(const OUString& rCommand, sal_Int32 nCommandLength )
|
||||
+static OUString lcl_ExtractToken(OUString const& rCommand,
|
||||
+ sal_Int32 & rIndex, bool & rHaveToken, bool & rIsSwitch)
|
||||
{
|
||||
- sal_Int32 nStartIndex = nCommandLength;
|
||||
- sal_Int32 nEndIndex = 0;
|
||||
- sal_Int32 nQuoteIndex = rCommand.indexOf( '\"', nStartIndex);
|
||||
- if( nQuoteIndex >= 0)
|
||||
+ rHaveToken = false;
|
||||
+ rIsSwitch = false;
|
||||
+
|
||||
+ OUStringBuffer token;
|
||||
+ bool bQuoted(false);
|
||||
+ for (; rIndex < rCommand.getLength(); ++rIndex)
|
||||
{
|
||||
- nStartIndex = nQuoteIndex + 1;
|
||||
- nEndIndex = rCommand.indexOf( '\"', nStartIndex + 1) - 1;
|
||||
+ sal_Unicode const currentChar(rCommand[rIndex]);
|
||||
+ switch (currentChar)
|
||||
+ {
|
||||
+ case '\\':
|
||||
+ {
|
||||
+ if (rIndex == rCommand.getLength() - 1)
|
||||
+ {
|
||||
+ SAL_INFO("writerfilter.dmapper", "field: trailing escape");
|
||||
+ ++rIndex;
|
||||
+ return OUString();
|
||||
+ }
|
||||
+ sal_Unicode const nextChar(rCommand[rIndex+1]);
|
||||
+ if (bQuoted || '\\' == nextChar)
|
||||
+ {
|
||||
+ ++rIndex; // read 2 chars
|
||||
+ token.append(nextChar);
|
||||
+ }
|
||||
+ else // field switch (case insensitive)
|
||||
+ {
|
||||
+ rHaveToken = true;
|
||||
+ if (token.isEmpty())
|
||||
+ {
|
||||
+ rIsSwitch = true;
|
||||
+ rIndex += 2; // read 2 chars
|
||||
+ return rCommand.copy(rIndex - 2, 2).toAsciiUpperCase();
|
||||
+ }
|
||||
+ else
|
||||
+ { // leave rIndex, read it again next time
|
||||
+ return token.makeStringAndClear();
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
+ case '\"':
|
||||
+ if (bQuoted || !token.isEmpty())
|
||||
+ {
|
||||
+ rHaveToken = true;
|
||||
+ if (bQuoted)
|
||||
+ {
|
||||
+ ++rIndex;
|
||||
+ }
|
||||
+ return token.makeStringAndClear();
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ bQuoted = true;
|
||||
+ }
|
||||
+ break;
|
||||
+ case ' ':
|
||||
+ if (bQuoted)
|
||||
+ {
|
||||
+ token.append(' ');
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (!token.isEmpty())
|
||||
+ {
|
||||
+ rHaveToken = true;
|
||||
+ ++rIndex;
|
||||
+ return token.makeStringAndClear();
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ token.append(currentChar);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ assert(rIndex == rCommand.getLength());
|
||||
+ if (bQuoted)
|
||||
+ {
|
||||
+ SAL_INFO("writerfilter.dmapper",
|
||||
+ "field argument with unterminated quote");
|
||||
+ return OUString();
|
||||
}
|
||||
else
|
||||
{
|
||||
- nEndIndex = rCommand.indexOf(" \\", nStartIndex);
|
||||
+ rHaveToken = !token.isEmpty();
|
||||
+ return token.makeStringAndClear();
|
||||
}
|
||||
- OUString sRet;
|
||||
- if( nEndIndex > nStartIndex + 1 )
|
||||
+}
|
||||
+
|
||||
+SAL_DLLPUBLIC_EXPORT // export just for test
|
||||
+boost::tuple<OUString, vector<OUString>, vector<OUString> >
|
||||
+lcl_SplitFieldCommand(const OUString& rCommand)
|
||||
+{
|
||||
+ OUString sType;
|
||||
+ vector<OUString> arguments;
|
||||
+ vector<OUString> switches;
|
||||
+ sal_Int32 nStartIndex(0);
|
||||
+
|
||||
+ do
|
||||
{
|
||||
- //remove spaces at start and end of the result
|
||||
- if(nQuoteIndex <= 0)
|
||||
+ bool bHaveToken;
|
||||
+ bool bIsSwitch;
|
||||
+ OUString const token =
|
||||
+ lcl_ExtractToken(rCommand, nStartIndex, bHaveToken, bIsSwitch);
|
||||
+ assert(nStartIndex <= rCommand.getLength());
|
||||
+ if (bHaveToken)
|
||||
{
|
||||
- const sal_Unicode* pCommandStr = rCommand.getStr();
|
||||
- while( nStartIndex < nEndIndex && pCommandStr[nStartIndex] == ' ')
|
||||
- ++nStartIndex;
|
||||
- while( nEndIndex > nStartIndex && pCommandStr[nEndIndex] == ' ')
|
||||
- --nEndIndex;
|
||||
+ if (sType.isEmpty())
|
||||
+ {
|
||||
+ sType = token.toAsciiUpperCase();
|
||||
+ }
|
||||
+ else if (bIsSwitch || !switches.empty())
|
||||
+ {
|
||||
+ switches.push_back(token);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ arguments.push_back(token);
|
||||
+ }
|
||||
}
|
||||
- sRet = rCommand.copy( nStartIndex, nEndIndex - nStartIndex + 1);
|
||||
- }
|
||||
- return sRet;
|
||||
-}
|
||||
+ } while (nStartIndex < rCommand.getLength());
|
||||
|
||||
+ return boost::make_tuple(sType, arguments, switches);
|
||||
+}
|
||||
|
||||
|
||||
OUString lcl_ExctractAskVariableAndHint( const OUString& rCommand, OUString& rHint )
|
||||
@@ -2480,7 +2577,7 @@ void DomainMapper_Impl::handleAutoNum
|
||||
}
|
||||
|
||||
void DomainMapper_Impl::handleAuthor
|
||||
- (FieldContextPtr pContext,
|
||||
+ (OUString const& rFirstParam,
|
||||
PropertyNameSupplier& rPropNameSupplier,
|
||||
uno::Reference< uno::XInterface > & /*xFieldInterface*/,
|
||||
uno::Reference< beans::XPropertySet > xFieldProperties,
|
||||
@@ -2490,19 +2587,7 @@ void DomainMapper_Impl::handleAuthor
|
||||
xFieldProperties->setPropertyValue
|
||||
( rPropNameSupplier.GetName(PROP_FULL_NAME), uno::makeAny( true ));
|
||||
|
||||
- sal_Int32 nLen = sizeof( " AUTHOR" );
|
||||
- if ( eFieldId != FIELD_AUTHOR )
|
||||
- {
|
||||
- if ( eFieldId == FIELD_USERINITIALS )
|
||||
- nLen = sizeof( " USERINITIALS" );
|
||||
- else if ( eFieldId == FIELD_USERNAME )
|
||||
- nLen = sizeof( " USERNAME" );
|
||||
- }
|
||||
-
|
||||
- OUString sParam =
|
||||
- lcl_ExtractParameter(pContext->GetCommand(), nLen );
|
||||
-
|
||||
- if(!sParam.isEmpty())
|
||||
+ if (!rFirstParam.isEmpty())
|
||||
{
|
||||
xFieldProperties->setPropertyValue(
|
||||
rPropNameSupplier.GetName( PROP_IS_FIXED ),
|
||||
@@ -2513,16 +2598,14 @@ void DomainMapper_Impl::handleAuthor
|
||||
|
||||
void DomainMapper_Impl::handleDocProperty
|
||||
(FieldContextPtr pContext,
|
||||
+ OUString const& rFirstParam,
|
||||
PropertyNameSupplier& rPropNameSupplier,
|
||||
uno::Reference< uno::XInterface > & xFieldInterface,
|
||||
uno::Reference< beans::XPropertySet > xFieldProperties)
|
||||
{
|
||||
//some docproperties should be imported as document statistic fields, some as DocInfo fields
|
||||
//others should be user fields
|
||||
- OUString sParam =
|
||||
- lcl_ExtractParameter(pContext->GetCommand(), sizeof(" DOCPROPERTY") );
|
||||
-
|
||||
- if(!sParam.isEmpty())
|
||||
+ if (!rFirstParam.isEmpty())
|
||||
{
|
||||
#define SET_ARABIC 0x01
|
||||
#define SET_FULL_NAME 0x02
|
||||
@@ -2562,7 +2645,7 @@ void DomainMapper_Impl::handleAuthor
|
||||
for( ; nMap < sizeof(aDocProperties) / sizeof(DocPropertyMap);
|
||||
++nMap )
|
||||
{
|
||||
- if(sParam.equalsAscii(aDocProperties[nMap].pDocPropertyName))
|
||||
+ if (rFirstParam.equalsAscii(aDocProperties[nMap].pDocPropertyName))
|
||||
{
|
||||
sFieldServiceName =
|
||||
OUString::createFromAscii
|
||||
@@ -2589,7 +2672,7 @@ void DomainMapper_Impl::handleAuthor
|
||||
uno::UNO_QUERY_THROW);
|
||||
if( bIsCustomField )
|
||||
xFieldProperties->setPropertyValue(
|
||||
- rPropNameSupplier.GetName(PROP_NAME), uno::makeAny( sParam ));
|
||||
+ rPropNameSupplier.GetName(PROP_NAME), uno::makeAny(rFirstParam));
|
||||
else
|
||||
{
|
||||
if(0 != (aDocProperties[nMap].nFlags & SET_ARABIC))
|
||||
@@ -2889,13 +2972,14 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
try
|
||||
{
|
||||
uno::Reference< uno::XInterface > xFieldInterface;
|
||||
- //at first determine the field type - erase leading and trailing whitespaces
|
||||
- OUString sCommand( pContext->GetCommand().trim() );
|
||||
- sal_Int32 nSpaceIndex = sCommand.indexOf( ' ' );
|
||||
- if( 0 <= nSpaceIndex )
|
||||
- sCommand = sCommand.copy(0, nSpaceIndex).toAsciiUpperCase();
|
||||
|
||||
- FieldConversionMap_t::iterator aIt = aFieldConversionMap.find(sCommand);
|
||||
+ boost::tuple<OUString, vector<OUString>, vector<OUString> > const
|
||||
+ field(lcl_SplitFieldCommand(pContext->GetCommand()));
|
||||
+ OUString const sFirstParam(boost::get<1>(field).empty()
|
||||
+ ? OUString() : boost::get<1>(field).front());
|
||||
+
|
||||
+ FieldConversionMap_t::iterator const aIt =
|
||||
+ aFieldConversionMap.find(boost::get<0>(field));
|
||||
if(aIt != aFieldConversionMap.end())
|
||||
{
|
||||
uno::Reference< beans::XPropertySet > xFieldProperties;
|
||||
@@ -2937,7 +3021,8 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
if ( bCreateEnhancedField )
|
||||
{
|
||||
FieldConversionMap_t aEnhancedFieldConversionMap = lcl_GetEnhancedFieldConversion();
|
||||
- FieldConversionMap_t::iterator aEnhancedIt = aEnhancedFieldConversionMap.find(sCommand);
|
||||
+ FieldConversionMap_t::iterator aEnhancedIt =
|
||||
+ aEnhancedFieldConversionMap.find(boost::get<0>(field));
|
||||
if ( aEnhancedIt != aEnhancedFieldConversionMap.end())
|
||||
sServiceName += OUString::createFromAscii(aEnhancedIt->second.cFieldServiceName );
|
||||
}
|
||||
@@ -2975,7 +3060,9 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
case FIELD_AUTHOR :
|
||||
case FIELD_USERNAME :
|
||||
case FIELD_USERINITIALS :
|
||||
- handleAuthor(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties, aIt->second.eFieldId );
|
||||
+ handleAuthor(sFirstParam, rPropNameSupplier,
|
||||
+ xFieldInterface, xFieldProperties,
|
||||
+ aIt->second.eFieldId);
|
||||
break;
|
||||
case FIELD_DATE:
|
||||
if (xFieldProperties.is())
|
||||
@@ -3014,14 +3101,14 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
}
|
||||
break;
|
||||
case FIELD_DOCPROPERTY :
|
||||
- handleDocProperty(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties);
|
||||
+ handleDocProperty(pContext, sFirstParam, rPropNameSupplier,
|
||||
+ xFieldInterface, xFieldProperties);
|
||||
break;
|
||||
case FIELD_DOCVARIABLE :
|
||||
{
|
||||
- OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" DOCVARIABLE") );
|
||||
//create a user field and type
|
||||
uno::Reference< beans::XPropertySet > xMaster =
|
||||
- FindOrCreateFieldMaster( "com.sun.star.text.FieldMaster.User", sParam );
|
||||
+ FindOrCreateFieldMaster("com.sun.star.text.FieldMaster.User", sFirstParam);
|
||||
uno::Reference< text::XDependentTextField > xDependentField( xFieldInterface, uno::UNO_QUERY_THROW );
|
||||
xDependentField->attachTextFieldMaster( xMaster );
|
||||
m_bSetUserFieldContent = true;
|
||||
@@ -3047,7 +3134,7 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
else
|
||||
{
|
||||
//merge Read_SubF_Ruby into filter/.../util.cxx and reuse that ?
|
||||
- nSpaceIndex = aCommand.indexOf(' ');
|
||||
+ sal_Int32 nSpaceIndex = aCommand.indexOf(' ');
|
||||
if(nSpaceIndex > 0)
|
||||
aCommand = aCommand.copy(nSpaceIndex).trim();
|
||||
if (aCommand.startsWith("\\s"))
|
||||
@@ -3178,8 +3265,7 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
case FIELD_INCLUDEPICTURE: break;
|
||||
case FIELD_KEYWORDS :
|
||||
{
|
||||
- OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" KEYWORDS") );
|
||||
- if(!sParam.isEmpty())
|
||||
+ if (!sFirstParam.isEmpty())
|
||||
{
|
||||
xFieldProperties->setPropertyValue(
|
||||
rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true ));
|
||||
@@ -3209,10 +3295,9 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
case FIELD_MERGEFIELD :
|
||||
{
|
||||
//todo: create a database field and fieldmaster pointing to a column, only
|
||||
- OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" MERGEFIELD") );
|
||||
//create a user field and type
|
||||
uno::Reference< beans::XPropertySet > xMaster =
|
||||
- FindOrCreateFieldMaster( "com.sun.star.text.FieldMaster.Database", sParam );
|
||||
+ FindOrCreateFieldMaster("com.sun.star.text.FieldMaster.Database", sFirstParam);
|
||||
|
||||
// xFieldProperties->setPropertyValue(
|
||||
// "FieldCode",
|
||||
@@ -3243,21 +3328,21 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
if (xFieldProperties.is())
|
||||
{
|
||||
bool bPageRef = aIt->second.eFieldId == FIELD_PAGEREF;
|
||||
- OUString sBookmark = lcl_ExtractParameter(pContext->GetCommand(),
|
||||
- (bPageRef ? sizeof(" PAGEREF") : sizeof(" REF")));
|
||||
|
||||
// Do we need a GetReference (default) or a GetExpression field?
|
||||
uno::Reference< text::XTextFieldsSupplier > xFieldsSupplier( GetTextDocument(), uno::UNO_QUERY );
|
||||
uno::Reference< container::XNameAccess > xFieldMasterAccess = xFieldsSupplier->getTextFieldMasters();
|
||||
|
||||
- if (!xFieldMasterAccess->hasByName("com.sun.star.text.FieldMaster.SetExpression." + sBookmark))
|
||||
+ if (!xFieldMasterAccess->hasByName(
|
||||
+ "com.sun.star.text.FieldMaster.SetExpression."
|
||||
+ + sFirstParam))
|
||||
{
|
||||
xFieldProperties->setPropertyValue(
|
||||
rPropNameSupplier.GetName(PROP_REFERENCE_FIELD_SOURCE),
|
||||
uno::makeAny( sal_Int16(text::ReferenceFieldSource::BOOKMARK)) );
|
||||
xFieldProperties->setPropertyValue(
|
||||
rPropNameSupplier.GetName(PROP_SOURCE_NAME),
|
||||
- uno::makeAny( sBookmark) );
|
||||
+ uno::makeAny(sFirstParam) );
|
||||
sal_Int16 nFieldPart = (bPageRef ? text::ReferenceFieldPart::PAGE : text::ReferenceFieldPart::TEXT);
|
||||
OUString sValue;
|
||||
if( lcl_FindInCommand( pContext->GetCommand(), 'p', sValue ))
|
||||
@@ -3287,7 +3372,9 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
{
|
||||
xFieldInterface = m_xTextFactory->createInstance("com.sun.star.text.TextField.GetExpression");
|
||||
xFieldProperties.set(xFieldInterface, uno::UNO_QUERY);
|
||||
- xFieldProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_CONTENT), uno::makeAny(sBookmark));
|
||||
+ xFieldProperties->setPropertyValue(
|
||||
+ rPropNameSupplier.GetName(PROP_CONTENT),
|
||||
+ uno::makeAny(sFirstParam));
|
||||
xFieldProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_SUB_TYPE), uno::makeAny(text::SetVariableType::STRING));
|
||||
}
|
||||
}
|
||||
@@ -3354,8 +3441,7 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
case FIELD_STYLEREF : break;
|
||||
case FIELD_SUBJECT :
|
||||
{
|
||||
- OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" SUBJECT") );
|
||||
- if(!sParam.isEmpty())
|
||||
+ if (!sFirstParam.isEmpty())
|
||||
{
|
||||
xFieldProperties->setPropertyValue(
|
||||
rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true ));
|
||||
@@ -3370,8 +3456,7 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
break;
|
||||
case FIELD_TITLE :
|
||||
{
|
||||
- OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" TITLE") );
|
||||
- if(!sParam.isEmpty())
|
||||
+ if (!sFirstParam.isEmpty())
|
||||
{
|
||||
xFieldProperties->setPropertyValue(
|
||||
rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true ));
|
||||
@@ -3391,10 +3476,11 @@ void DomainMapper_Impl::CloseFieldCommand()
|
||||
m_xTextFactory->createInstance(
|
||||
OUString::createFromAscii(aIt->second.cFieldServiceName)),
|
||||
uno::UNO_QUERY_THROW);
|
||||
- OUString sTCText = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" TC") );
|
||||
- if( !sTCText.isEmpty())
|
||||
+ if (!sFirstParam.isEmpty())
|
||||
+ {
|
||||
xTC->setPropertyValue(rPropNameSupplier.GetName(PROP_ALTERNATIVE_TEXT),
|
||||
- uno::makeAny(sTCText));
|
||||
+ uno::makeAny(sFirstParam));
|
||||
+ }
|
||||
OUString sValue;
|
||||
// \f TC entry in doc with multiple tables
|
||||
// if( lcl_FindInCommand( pContext->GetCommand(), 'f', sValue ))
|
||||
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
|
||||
index 1ebf067..4686baa 100644
|
||||
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
|
||||
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
|
||||
@@ -576,13 +576,14 @@ public:
|
||||
uno::Reference< uno::XInterface > & xFieldInterface,
|
||||
uno::Reference< beans::XPropertySet > xFieldProperties);
|
||||
void handleAuthor
|
||||
- (FieldContextPtr pContext,
|
||||
+ (OUString const& rFirstParam,
|
||||
PropertyNameSupplier& rPropNameSupplier,
|
||||
uno::Reference< uno::XInterface > & xFieldInterface,
|
||||
uno::Reference< beans::XPropertySet > xFieldProperties,
|
||||
FieldId eFieldId);
|
||||
void handleDocProperty
|
||||
(FieldContextPtr pContext,
|
||||
+ OUString const& rFirstParam,
|
||||
PropertyNameSupplier& rPropNameSupplier,
|
||||
uno::Reference< uno::XInterface > & xFieldInterface,
|
||||
uno::Reference< beans::XPropertySet > xFieldProperties);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,321 +0,0 @@
|
||||
From 9a156365277c93bd66c2ef21c42bfa377eaf314b Mon Sep 17 00:00:00 2001
|
||||
From: Michael Stahl <mstahl@redhat.com>
|
||||
Date: Wed, 5 Mar 2014 23:29:06 +0100
|
||||
Subject: [PATCH 2/2] rhbz#988516: DOCX import: fix context stack when
|
||||
importing header/footer
|
||||
|
||||
When a header/footer substream is parsed, a ParagraphGroup is started,
|
||||
but not ended; so the properties of the last paragraph in the
|
||||
header/footer are applied to a paragraph in the body.
|
||||
|
||||
The obvious fix to add a call to endParagraphGroup() at the end of w:p
|
||||
element breaks table cells. So add a call to endParagraphGroup() at
|
||||
the end of the "hdr"/"ftr" element.
|
||||
|
||||
(The problem in the bugdoc became much more visible with commit
|
||||
ca555c596043c88894b964ac5e21f5a7271d5f3b, but was there before)
|
||||
|
||||
Change-Id: Ib054f1882793049b39424c1076ba5d4b319cd027
|
||||
(cherry picked from commit 2b78f2cd7b9e4bab0f3b3b9119238f36a1bbc7b2)
|
||||
Reviewed-on: https://gerrit.libreoffice.org/8477
|
||||
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
|
||||
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
|
||||
---
|
||||
sw/qa/extras/ooxmlimport/data/rhbz988516.docx | Bin 0 -> 15513 bytes
|
||||
sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 12 ++++++++++++
|
||||
writerfilter/source/ooxml/model.xml | 4 +++-
|
||||
3 files changed, 15 insertions(+), 1 deletion(-)
|
||||
create mode 100644 sw/qa/extras/ooxmlimport/data/rhbz988516.docx
|
||||
|
||||
diff --git a/sw/qa/extras/ooxmlimport/data/rhbz988516.docx b/sw/qa/extras/ooxmlimport/data/rhbz988516.docx
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..38e2dcff324036a333060f10475fa60a6c872074
|
||||
GIT binary patch
|
||||
literal 15513
|
||||
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
|
||||
JJIAkI{|EA+bCm!9
|
||||
|
||||
literal 0
|
||||
HcmV?d00001
|
||||
|
||||
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
|
||||
index dca64b7..4c8a790 100644
|
||||
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
|
||||
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
|
||||
@@ -189,6 +189,18 @@ DECLARE_OOXMLIMPORT_TEST(testN757890, "n757890.docx")
|
||||
CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::CENTER, nValue);
|
||||
}
|
||||
|
||||
+DECLARE_OOXMLIMPORT_TEST(testRhbz988516, "rhbz988516.docx")
|
||||
+{
|
||||
+ // The problem was that the list properties of the footer leaked into body
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(),
|
||||
+ getProperty<OUString>(getParagraph(1), "NumberingStyleName"));
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString("Enclosure 3"), getParagraph(2)->getString());
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(),
|
||||
+ getProperty<OUString>(getParagraph(2), "NumberingStyleName"));
|
||||
+ CPPUNIT_ASSERT_EQUAL(OUString(),
|
||||
+ getProperty<OUString>(getParagraph(3), "NumberingStyleName"));
|
||||
+}
|
||||
+
|
||||
DECLARE_OOXMLIMPORT_TEST(testFdo49940, "fdo49940.docx")
|
||||
{
|
||||
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
|
||||
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
|
||||
index a049fde..6018582 100644
|
||||
--- a/writerfilter/source/ooxml/model.xml
|
||||
+++ b/writerfilter/source/ooxml/model.xml
|
||||
@@ -22557,7 +22557,9 @@
|
||||
<element name="headerReference" tokenid="ooxml:EG_HdrFtrReferences_headerReference"/>
|
||||
<element name="footerReference" tokenid="ooxml:EG_HdrFtrReferences_footerReference"/>
|
||||
</resource>
|
||||
- <resource name="CT_HdrFtr" resource="Stream" tag="header"/>
|
||||
+ <resource name="CT_HdrFtr" resource="Stream" tag="header">
|
||||
+ <action name="end" action="endParagraphGroup"/>
|
||||
+ </resource>
|
||||
<resource name="EG_SectPrContents" resource="Properties" tag="section">
|
||||
<element name="bidi" tokenid="ooxml:EG_SectPrContents_bidi"/>
|
||||
<element name="cols" tokenid="ooxml:EG_SectPrContents_cols"/>
|
||||
--
|
||||
1.8.3.1
|
||||
|
Loading…
Reference in new issue