sw/inc/crsrsh.hxx | 4 +-- sw/qa/extras/odfimport/data/fdo69862.odt |binary sw/qa/extras/odfimport/data/fdo69979.odt |binary sw/qa/extras/odfimport/odfimport.cxx | 36 +++++++++++++++++++++++++++++++ sw/source/core/crsr/crsrsh.cxx | 12 +++++----- sw/source/core/edit/eddel.cxx | 2 - sw/source/core/edit/edglss.cxx | 2 - sw/source/ui/wrtsh/select.cxx | 8 ++++++ 8 files changed, 53 insertions(+), 11 deletions(-)
New commits: commit 445ecfa7d9bf8a1779224ad53e9b14b9f571b10b Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Mon Oct 28 11:15:43 2013 +0100 bnc#825891 fdo#69893 fix SwWrtShell::SelAll() to work with empty table at doc start In theory, it was a problem to have the table cursor around when having the selection outside the table; but it didn't cause a problem so far. However, when the table has one or more empty cells, we really need to leave table mode, otherwise only the table gets selected. Change-Id: I766903ed624b9338f0612697b4c03f44de1d2e41 (cherry picked from commit d1eb536c7e410d40fd94c76b157bbd4ed7944d4c) Conflicts: sw/qa/extras/uiwriter/uiwriter.cxx diff --git a/sw/source/ui/wrtsh/select.cxx b/sw/source/ui/wrtsh/select.cxx index 3923fe3..feb47e3 100644 --- a/sw/source/ui/wrtsh/select.cxx +++ b/sw/source/ui/wrtsh/select.cxx @@ -162,7 +162,13 @@ long SwWrtShell::SelAll() bool bStartsWithTable = StartsWithTable(); if (bStartsWithTable) + { + // Disable table cursor to make sure getShellCrsr() returns m_pCurCrsr, not m_pTblCrsr. + if (IsTableMode()) + TblCrsrToCursor(); + // Do the extended select all on m_pCurCrsr. ExtendedSelectAll(/*bFootnotes =*/ false); + } if( pStartPos ) { commit d9124b3f30de8693da0e9d4f5ccc3cf815996e38 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Oct 2 11:19:18 2013 +0200 bnc#825891 fdo#69979 SwCrsrShell::ExtendedSelectAll: exclude headers, too It turns out, normal Ctrl-A doesn't select headers, footers and fly content, either (just like not selecting footnotes). So do the same when in the "doc starts with table" special mode. Change-Id: Ib9bc397944a4d07ea03bc326f1536733c57f42e6 (cherry picked from commit 232df42b8dc0b4f7a335d2931fc0f29e73b8bca0) Conflicts: sw/qa/extras/odfimport/odfimport.cxx sw/source/core/crsr/crsrsh.cxx diff --git a/sw/qa/extras/odfimport/data/fdo69979.odt b/sw/qa/extras/odfimport/data/fdo69979.odt new file mode 100644 index 0000000..8f7d77e Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo69979.odt differ diff --git a/sw/qa/extras/odfimport/odfimport.cxx b/sw/qa/extras/odfimport/odfimport.cxx index 6a1240e..eb8a819 100644 --- a/sw/qa/extras/odfimport/odfimport.cxx +++ b/sw/qa/extras/odfimport/odfimport.cxx @@ -49,6 +49,7 @@ public: void testFdo37606(); void testFdo37606Copy(); void testFdo69862(); + void testFdo69979(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -70,6 +71,7 @@ void Test::run() {"fdo37606.odt", &Test::testFdo37606}, {"fdo37606.odt", &Test::testFdo37606Copy}, {"fdo69862.odt", &Test::testFdo69862}, + {"fdo69979.odt", &Test::testFdo69979}, }; for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) { @@ -371,7 +373,22 @@ void Test::testFdo69862() SwTxtNode& rEnd = dynamic_cast<SwTxtNode&>(pShellCrsr->End()->nNode.GetNode()); CPPUNIT_ASSERT_EQUAL(String("H" "\x01" "ello."), rEnd.GetTxt()); +} + +void Test::testFdo69979() +{ + // The test doc is special in that it starts with a table and it also has a header. + SwXTextDocument* pTxtDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + SwWrtShell* pWrtShell = pTxtDoc->GetDocShell()->GetWrtShell(); + SwShellCrsr* pShellCrsr = pWrtShell->getShellCrsr(false); + pWrtShell->SelAll(); + SwTxtNode& rStart = dynamic_cast<SwTxtNode&>(pShellCrsr->Start()->nNode.GetNode()); + // This was "", as Ctrl-A also selected headers, but it should not. + CPPUNIT_ASSERT_EQUAL(String("A1"), rStart.GetTxt()); + + SwTxtNode& rEnd = dynamic_cast<SwTxtNode&>(pShellCrsr->End()->nNode.GetNode()); + CPPUNIT_ASSERT_EQUAL(String("Hello."), rEnd.GetTxt()); } CPPUNIT_TEST_SUITE_REGISTRATION(Test); diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 357e9c9..2b02fa1 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -539,7 +539,7 @@ void SwCrsrShell::ExtendedSelectAll(bool bFootnotes) { SwNodes& rNodes = GetDoc()->GetNodes(); SwPosition* pPos = pCurCrsr->GetPoint(); - pPos->nNode = bFootnotes ? rNodes.GetEndOfPostIts() : rNodes.GetEndOfInserts(); + pPos->nNode = bFootnotes ? rNodes.GetEndOfPostIts() : rNodes.GetEndOfAutotext(); pPos->nContent.Assign( rNodes.GoNext( &pPos->nNode ), 0 ); pPos = pCurCrsr->GetMark(); pPos->nNode = rNodes.GetEndOfContent(); @@ -550,7 +550,7 @@ void SwCrsrShell::ExtendedSelectAll(bool bFootnotes) bool SwCrsrShell::ExtendedSelectedAll(bool bFootnotes) { SwNodes& rNodes = GetDoc()->GetNodes(); - SwNodeIndex nNode = bFootnotes ? rNodes.GetEndOfPostIts() : rNodes.GetEndOfInserts(); + SwNodeIndex nNode = bFootnotes ? rNodes.GetEndOfPostIts() : rNodes.GetEndOfAutotext(); SwCntntNode* pStart = rNodes.GoNext(&nNode); nNode = rNodes.GetEndOfContent(); commit 40af3a9a08dade609cd2d5b5710072eaf44baf7d Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Mon Sep 30 11:45:35 2013 +0200 bnc#825891 fdo#69862 SwCrsrShell::ExtendedSelectAll: don't always select footnotes ExtendedSelectAll() was originally invented to e.g. select the whole document, change the language of the selection and then inmediately (before the layout is updated) undo the selection. When using it for "select all and doc starts with a table" purposes, then footnotes shouldn't be selected, just like those are not selected either, when the doc starts with a normal paragraph. Their anchor is still selected, and that's enough to have correct delete and copy&paste. Change-Id: I4fc49db628054a4b8a46effc2d0328eaabcaa9f8 (cherry picked from commit 959711f1276106b0aaee69ab660f1b0d3ece5bbc) Conflicts: sw/source/core/crsr/crsrsh.cxx sw/source/core/edit/eddel.cxx diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx index f8dfdd2..f078357 100644 --- a/sw/inc/crsrsh.hxx +++ b/sw/inc/crsrsh.hxx @@ -323,9 +323,9 @@ public: // SelAll() selects the document body content // if ExtendedSelect() is called afterwards, the whole nodes array is selected // only for usage in special cases allowed! - void ExtendedSelectAll(); + void ExtendedSelectAll(bool bFootnotes = true); /// If ExtendedSelectAll() was called and selection didn't change since then. - bool ExtendedSelectedAll(); + bool ExtendedSelectedAll(bool bFootnotes = true); /// If document body starts with a table. bool StartsWithTable(); diff --git a/sw/qa/extras/odfimport/data/fdo69862.odt b/sw/qa/extras/odfimport/data/fdo69862.odt new file mode 100644 index 0000000..aec48fd Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo69862.odt differ diff --git a/sw/qa/extras/odfimport/odfimport.cxx b/sw/qa/extras/odfimport/odfimport.cxx index 456eb50..6a1240e 100644 --- a/sw/qa/extras/odfimport/odfimport.cxx +++ b/sw/qa/extras/odfimport/odfimport.cxx @@ -48,6 +48,7 @@ public: void testFdo56272(); void testFdo37606(); void testFdo37606Copy(); + void testFdo69862(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -68,6 +69,7 @@ void Test::run() {"fdo56272.odt", &Test::testFdo56272}, {"fdo37606.odt", &Test::testFdo37606}, {"fdo37606.odt", &Test::testFdo37606Copy}, + {"fdo69862.odt", &Test::testFdo69862}, }; for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) { @@ -355,6 +357,23 @@ void Test::testFdo37606Copy() CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTables->getCount()); } +void Test::testFdo69862() +{ + // The test doc is special in that it starts with a table and it also has a footnote. + SwXTextDocument* pTxtDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + SwWrtShell* pWrtShell = pTxtDoc->GetDocShell()->GetWrtShell(); + SwShellCrsr* pShellCrsr = pWrtShell->getShellCrsr(false); + + pWrtShell->SelAll(); + SwTxtNode& rStart = dynamic_cast<SwTxtNode&>(pShellCrsr->Start()->nNode.GetNode()); + // This was "Footnote.", as Ctrl-A also selected footnotes, but it should not. + CPPUNIT_ASSERT_EQUAL(String("A1"), rStart.GetTxt()); + + SwTxtNode& rEnd = dynamic_cast<SwTxtNode&>(pShellCrsr->End()->nNode.GetNode()); + CPPUNIT_ASSERT_EQUAL(String("H" "\x01" "ello."), rEnd.GetTxt()); + +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 75dec38..357e9c9 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -239,7 +239,7 @@ void SwCrsrShell::StartAction() void SwCrsrShell::EndAction( const sal_Bool bIdleEnd ) { sal_Bool bVis = bSVCrsrVis; - comphelper::FlagRestorationGuard g(mbSelectAll, StartsWithTable() && ExtendedSelectedAll()); + comphelper::FlagRestorationGuard g(mbSelectAll, StartsWithTable() && ExtendedSelectedAll(/*bFootnotes =*/ false)); // Idle-formatting? if( bIdleEnd && Imp()->GetRegion() ) @@ -535,11 +535,11 @@ sal_Bool SwCrsrShell::SttEndDoc( sal_Bool bStt ) return bRet; } -void SwCrsrShell::ExtendedSelectAll() +void SwCrsrShell::ExtendedSelectAll(bool bFootnotes) { SwNodes& rNodes = GetDoc()->GetNodes(); SwPosition* pPos = pCurCrsr->GetPoint(); - pPos->nNode = rNodes.GetEndOfPostIts(); + pPos->nNode = bFootnotes ? rNodes.GetEndOfPostIts() : rNodes.GetEndOfInserts(); pPos->nContent.Assign( rNodes.GoNext( &pPos->nNode ), 0 ); pPos = pCurCrsr->GetMark(); pPos->nNode = rNodes.GetEndOfContent(); @@ -547,10 +547,10 @@ void SwCrsrShell::ExtendedSelectAll() pPos->nContent.Assign( pCNd, pCNd ? pCNd->Len() : 0 ); } -bool SwCrsrShell::ExtendedSelectedAll() +bool SwCrsrShell::ExtendedSelectedAll(bool bFootnotes) { SwNodes& rNodes = GetDoc()->GetNodes(); - SwNodeIndex nNode = rNodes.GetEndOfPostIts(); + SwNodeIndex nNode = bFootnotes ? rNodes.GetEndOfPostIts() : rNodes.GetEndOfInserts(); SwCntntNode* pStart = rNodes.GoNext(&nNode); nNode = rNodes.GetEndOfContent(); @@ -1158,7 +1158,7 @@ sal_Bool SwCrsrShell::GoPrevCrsr() void SwCrsrShell::Paint( const Rectangle &rRect) { - comphelper::FlagRestorationGuard g(mbSelectAll, StartsWithTable() && ExtendedSelectedAll()); + comphelper::FlagRestorationGuard g(mbSelectAll, StartsWithTable() && ExtendedSelectedAll(/*bFootnotes =*/ false)); SET_CURR_SHELL( this ); // always switch off all cursors when painting diff --git a/sw/source/core/edit/eddel.cxx b/sw/source/core/edit/eddel.cxx index 1f98618..064fe3d 100644 --- a/sw/source/core/edit/eddel.cxx +++ b/sw/source/core/edit/eddel.cxx @@ -39,7 +39,7 @@ void SwEditShell::DeleteSel( SwPaM& rPam, sal_Bool* pUndo ) { - bool bSelectAll = StartsWithTable() && ExtendedSelectedAll(); + bool bSelectAll = StartsWithTable() && ExtendedSelectedAll(/*bFootnotes =*/ false); // nur bei Selektion if( !rPam.HasMark() || *rPam.GetPoint() == *rPam.GetMark()) return; diff --git a/sw/source/core/edit/edglss.cxx b/sw/source/core/edit/edglss.cxx index 8828b97e..8199db4 100644 --- a/sw/source/core/edit/edglss.cxx +++ b/sw/source/core/edit/edglss.cxx @@ -226,7 +226,7 @@ sal_Bool SwEditShell::_CopySelToDoc( SwDoc* pInsDoc, SwNodeIndex* pSttNd ) bool bColSel = _GetCrsr()->IsColumnSelection(); if( bColSel && pInsDoc->IsClipBoard() ) pInsDoc->SetColumnSelection( true ); - bool bSelectAll = StartsWithTable() && ExtendedSelectedAll(); + bool bSelectAll = StartsWithTable() && ExtendedSelectedAll(/*bFootnotes =*/ false); { FOREACHPAM_START(this) diff --git a/sw/source/ui/wrtsh/select.cxx b/sw/source/ui/wrtsh/select.cxx index c57c13c..3923fe3 100644 --- a/sw/source/ui/wrtsh/select.cxx +++ b/sw/source/ui/wrtsh/select.cxx @@ -162,7 +162,7 @@ long SwWrtShell::SelAll() bool bStartsWithTable = StartsWithTable(); if (bStartsWithTable) - ExtendedSelectAll(); + ExtendedSelectAll(/*bFootnotes =*/ false); if( pStartPos ) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits