update to 4.2.3 rc1

f41
David Tardon 11 years ago
parent 1c79122ff6
commit 0f5889b089

3
.gitignore vendored

@ -84,3 +84,6 @@
/libreoffice-4.2.2.1.tar.xz
/libreoffice-help-4.2.2.1.tar.xz
/libreoffice-translations-4.2.2.1.tar.xz
/libreoffice-4.2.3.1.tar.xz
/libreoffice-help-4.2.3.1.tar.xz
/libreoffice-translations-4.2.3.1.tar.xz

@ -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

@ -1,5 +1,5 @@
# download path contains version without the last (fourth) digit
%define libo_version 4.2.2
%define libo_version 4.2.3
# Should contain .alphaX / .betaX, if this is pre-release (actually
# pre-RC) version. The pre-release string is part of tarball file names,
# so we need a way to define it easily at one place.
@ -43,7 +43,7 @@ Summary: Free Software Productivity Suite
Name: libreoffice
Epoch: 1
Version: %{libo_version}.1
Release: 7%{?libo_prerelease}%{?dist}
Release: 1%{?libo_prerelease}%{?dist}
License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0
Group: Applications/Productivity
URL: http://www.libreoffice.org/default/
@ -273,25 +273,16 @@ Patch10: libreoffice-rhel6glib.patch
Patch11: 0001-Related-rhbz-1032774-bodge-around-reported-NULL-valu.patch
Patch12: 0001-Resolves-rhbz-1035092-no-shortcut-key-for-Italian-To.patch
Patch13: 0001-Resolves-rhbz-912529-Kerkis-SmallCaps-shown-instead-.patch
Patch14: 0001-Resolves-rhbz-1038189-refresh-printer-list-when-prin.patch
Patch15: 0001-disable-firebird-unit-test.patch
Patch16: 0001-never-run-autogen.sh.patch
Patch17: 0001-Related-rhbz-1065807-rework-i66157-for-multiple-writ.patch
Patch18: 0001-Resolves-rhbz-1065807-use-xdg-Templates-for-default-.patch
Patch19: 0001-explictly-list-common-lang-independant-template-dir.patch
Patch20: 0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch
Patch21: 0001-fdo-75540-setProcessServiceFactory-must-be-called-be.patch
Patch22: 0001-KDE-don-t-throw-on-TemplatePathVariable.patch
Patch23: 0001-Resolves-rhbz-1007697-Update-on-a-Window-triggering-.patch
Patch24: 0001-Wizards-should-look-for-templates-in-Template_intern.patch
Patch25: 0001-actively-search-for-wizards-dir-in-all-internal-temp.patch
Patch26: 0002-rhbz-988516-DOCX-import-fix-context-stack-when-impor.patch
Patch27: 0001-fdo-74787-rhbz-1072553-Fix-deselection-problems-of-t.patch
Patch28: 0001-rhbz-1072607-hopefully-fix-crash-in-SvxRuler-MouseMo.patch
Patch29: 0001-rhbz-1043551-sw-avoid-division-by-0-in-Text-Grid-pai.patch
Patch30: 0001-writerfilter-salvage-a-field-parameter-parsing-train.patch
Patch31: 0001-RTF-import-fix-spurious-page-breaks-at-doc-end-relat.patch
Patch32: 0001-Related-rhbz-1076264-intermittent-a11y-crash-in-calc.patch
Patch14: 0001-disable-firebird-unit-test.patch
Patch15: 0001-never-run-autogen.sh.patch
Patch16: 0001-Related-rhbz-1065807-rework-i66157-for-multiple-writ.patch
Patch17: 0001-Resolves-rhbz-1065807-use-xdg-Templates-for-default-.patch
Patch18: 0001-explictly-list-common-lang-independant-template-dir.patch
Patch19: 0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch
Patch20: 0001-KDE-don-t-throw-on-TemplatePathVariable.patch
Patch21: 0001-Wizards-should-look-for-templates-in-Template_intern.patch
Patch22: 0001-actively-search-for-wizards-dir-in-all-internal-temp.patch
Patch23: 0001-Related-rhbz-1076264-intermittent-a11y-crash-in-calc.patch
%define instdir %{_libdir}
%define baseinstdir %{instdir}/libreoffice
@ -2186,6 +2177,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
%endif
%changelog
* Mon Mar 17 2014 David Tardon <dtardon@redhat.com> - 1:4.2.3.1-1
- update to 4.2.3 rc1
* Fri Mar 14 2014 Caolán McNamara <caolanm@redhat.com> - 1:4.2.2.1-7
- Related: rhbz#1076264 intermittent a11y crash in calc

@ -6,6 +6,6 @@ a7983f859eafb2677d7ff386a023bc40 a7983f859eafb2677d7ff386a023bc40-xsltml_2.1.2.
1f24ab1d39f4a51faf22244c94a6203f 1f24ab1d39f4a51faf22244c94a6203f-xmlsec1-1.2.14.tar.gz
0168229624cfac409e766913506961a8 0168229624cfac409e766913506961a8-ucpp-1.3.2.tar.gz
12fb8b5b0d5132726e57b9b9fc7e22c4 libreoffice-multiliblauncher.sh
b8b00aac99c056e8908c1a89ad999f4b libreoffice-4.2.2.1.tar.xz
3c11900dce8a5e520abc8350045b2407 libreoffice-help-4.2.2.1.tar.xz
5ac66bd46617d00f759602c00e755ea0 libreoffice-translations-4.2.2.1.tar.xz
7a8fba9c3f362f4a4f4806606eb45f13 libreoffice-4.2.3.1.tar.xz
0e2ca22a12928232434ab285076f120d libreoffice-help-4.2.3.1.tar.xz
8a41d27f9a318d053457c4af19b5ded0 libreoffice-translations-4.2.3.1.tar.xz

Loading…
Cancel
Save