diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2013-02-11 12:59:49 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2013-02-11 13:27:47 +0100 |
commit | bd505fdb9f669f365ff39b0ef46f0742c638e333 (patch) | |
tree | 5e8530c6de1dae3a3664b357c64b69cad37eefb4 | |
parent | 6865445a5ec90b49c5fde58531def4b9a64f26e8 (diff) |
fdo#59573 position after fieldmark and before annotation anchor is read-only
Also revert "SwTxtPaintInfo::_DrawBackBrush: draw dark border around
comment highlight" (commit 57c8c34fcdc2d594d2da3593eb9d86d0daf4e18c), as
it draws confusing vertical lines inside the comment when it has
multiple runs.
Change-Id: If0f60e4a28878c2b31327ae3c04ae11470bc1f52
-rw-r--r-- | sw/qa/core/uwriter.cxx | 22 | ||||
-rw-r--r-- | sw/source/core/crsr/pam.cxx | 20 | ||||
-rw-r--r-- | sw/source/core/text/inftxt.cxx | 5 |
3 files changed, 42 insertions, 5 deletions
diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index 189a25cf2476..5f94c84ba2dd 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -91,6 +91,7 @@ public: void testUserPerceivedCharCount(); void testGraphicAnchorDeletion(); void testFdo57938(); + void testFdo59573(); CPPUNIT_TEST_SUITE(SwDocTest); CPPUNIT_TEST(randomTest); @@ -102,6 +103,7 @@ public: CPPUNIT_TEST(testUserPerceivedCharCount); CPPUNIT_TEST(testGraphicAnchorDeletion); CPPUNIT_TEST(testFdo57938); + CPPUNIT_TEST(testFdo59573); CPPUNIT_TEST_SUITE_END(); private: @@ -896,6 +898,26 @@ void SwDocTest::testFdo57938() CPPUNIT_ASSERT_EQUAL(false, aPaM.HasReadonlySel(false)); } +void SwDocTest::testFdo59573() +{ + SwNodeIndex aIdx(m_pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + + // Insert "abc" and create a fieldmark around "b". + OUString aTest("abc"); + m_pDoc->InsertString(aPaM, aTest); + aPaM.SetMark(); + aPaM.GetPoint()->nContent = 1; + aPaM.GetMark()->nContent = 2; + IDocumentMarkAccess* pMarksAccess = m_pDoc->getIDocumentMarkAccess(); + pMarksAccess->makeFieldBookmark(aPaM, "", ODF_COMMENTRANGE); + aPaM.GetPoint()->nContent = 4; + aPaM.GetMark()->nContent = 4; + // The problem was that the position after the fieldmark end and before the + // annotation anchor wasn't read-only. + CPPUNIT_ASSERT_EQUAL(true, aPaM.HasReadonlySel(false)); +} + void SwDocTest::setUp() { BootstrapFixture::setUp(); diff --git a/sw/source/core/crsr/pam.cxx b/sw/source/core/crsr/pam.cxx index 741679e3a8da..85aedf079d48 100644 --- a/sw/source/core/crsr/pam.cxx +++ b/sw/source/core/crsr/pam.cxx @@ -687,9 +687,9 @@ bool SwPaM::HasReadonlySel( bool bFormView ) const sw::mark::IMark* pB = NULL; bool bUnhandledMark = false; bool bCommentrangeMark = false; + const IDocumentMarkAccess* pMarksAccess = pDoc->getIDocumentMarkAccess(); if ( pDoc ) { - const IDocumentMarkAccess* pMarksAccess = pDoc->getIDocumentMarkAccess( ); pA = GetPoint() ? pMarksAccess->getFieldmarkFor( *GetPoint( ) ) : NULL; pB = GetMark( ) ? pMarksAccess->getFieldmarkFor( *GetMark( ) ) : pA; @@ -730,6 +730,24 @@ bool SwPaM::HasReadonlySel( bool bFormView ) const { bRet = !( pA == pB && pA != NULL ); } + + // Don't allow inserting characters between the 'field mark end' and + // the 'comment anchor'. + if (!bRet) + { + if (!pA && GetPoint() && GetPoint()->nNode.GetNode().IsTxtNode() && GetPoint()->nContent.GetIndex() > 0) + { + // getFieldmarkFor() searches for >= start and < end, so check for + // the previous character, to also get the fieldmark, if we're + // exactly at the end. + SwPosition aPrevChar(*GetPoint()); + aPrevChar.nContent--; + sw::mark::IFieldmark* pFieldmark = pMarksAccess->getFieldmarkFor(aPrevChar); + if (pFieldmark && pFieldmark->GetMarkEnd() == *GetPoint()) + bRet = true; + } + } + return bRet; } diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx index 3696cb880fec..d67248aa327b 100644 --- a/sw/source/core/text/inftxt.cxx +++ b/sw/source/core/text/inftxt.cxx @@ -1119,15 +1119,12 @@ void SwTxtPaintInfo::_DrawBackBrush( const SwLinePortion &rPor ) const const OUString& rAuthor = rPostItField.GetFld()->GetPar1(); sal_uInt16 nIndex = pNd->GetDoc()->InsertRedlineAuthor(rAuthor); pOutDev->SetFillColor( SwPostItMgr::GetColorLight(nIndex) ); - pOutDev->SetLineColor( SwPostItMgr::GetColorAnchor(nIndex) ); bFilled = true; } } if (!bFilled) - { pOutDev->SetFillColor( SwViewOption::GetFieldShadingsColor() ); - pOutDev->SetLineColor( ); - } + pOutDev->SetLineColor( ); pOutDev->DrawRect( aIntersect.SVRect() ); pOutDev->Pop(); } |