diff options
| author | Michael Stahl <mstahl@redhat.com> | 2013-03-27 23:09:59 +0100 | 
|---|---|---|
| committer | Miklos Vajna <vmiklos@suse.cz> | 2013-03-28 08:24:18 +0000 | 
| commit | 710eb8c34cbd8fa80b6190107856cdc1d16f7cf8 (patch) | |
| tree | e2db29c95252bd000ef25f389b0dea26abf2907e | |
| parent | 1107e4d7e03ecd3f36993d362b6b42e5806817d8 (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
(cherry picked from commit b227a8e4d65e4bbfe991aed9342fe3e30eca8639)
Reviewed-on: https://gerrit.libreoffice.org/3100
Reviewed-by: Miklos Vajna <vmiklos@suse.cz>
Tested-by: Miklos Vajna <vmiklos@suse.cz>
| -rw-r--r-- | sw/source/core/crsr/crsrsh.cxx | 12 | 
1 files changed, 8 insertions, 4 deletions
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 379af07d0035..ac00ff73114b 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();      }  }  | 
