summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2013-03-27 23:09:59 +0100
committerMichael Stahl <mstahl@redhat.com>2013-03-27 23:47:00 +0100
commitb227a8e4d65e4bbfe991aed9342fe3e30eca8639 (patch)
tree64ca9d8b92092739385bf64a8ff97a067f8350b7
parent159edc43135bd02f6d507424c3b0546c2e03851f (diff)
fdo#60513: SwCrsrShell::Push(): take position from table cursor
If there is a table cursor, store its point/mark position on the cursor stack instead of pCurCrsr, which in this case is just one cell in a ring that contains a SwShellCrsr for every selected cell. SwCrsrShell::Pop() is surprisingly able to restore the prior state, because it calls UpdateCrsr(), which detects that the pCurCrsr spans multiple table cells and re-creates pTblCrsr, and then later on the first GetCrsr() call SwTableCursor::MakeBoxSels() will restore the ring of SwShellCrsrs from the pTblCrsr selection. Change-Id: Ibe9a7f379ece61c7dab1a6f69abaebf42a4c85ec
-rw-r--r--sw/source/core/crsr/crsrsh.cxx12
1 files changed, 8 insertions, 4 deletions
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index 8f0c03c2184d..0c9a6200fa50 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -1859,13 +1859,17 @@ void SwCrsrShell::RefreshBlockCursor()
/// create a copy of the cursor and save it in the stack
void SwCrsrShell::Push()
{
- pCrsrStk = new SwShellCrsr( *this, *pCurCrsr->GetPoint(),
- pCurCrsr->GetPtPos(), pCrsrStk );
+ // fdo#60513: if we have a table cursor, copy that; else copy current.
+ // This seems to work because UpdateCrsr() will fix this up on Pop(),
+ // then MakeBoxSels() will re-create the current pCurCrsr cell ring.
+ SwShellCrsr *const pCurrent((pTblCrsr) ? pTblCrsr : pCurCrsr);
+ pCrsrStk = new SwShellCrsr( *this, *pCurrent->GetPoint(),
+ pCurrent->GetPtPos(), pCrsrStk );
- if( pCurCrsr->HasMark() )
+ if (pCurrent->HasMark())
{
pCrsrStk->SetMark();
- *pCrsrStk->GetMark() = *pCurCrsr->GetMark();
+ *pCrsrStk->GetMark() = *pCurrent->GetMark();
}
}