sw/inc/undobj.hxx | 3 + sw/source/core/crsr/crsrsh.cxx | 6 ++- sw/source/core/doc/DocumentContentOperationsManager.cxx | 5 ++ sw/source/core/edit/eddel.cxx | 7 +++ sw/source/core/undo/undel.cxx | 23 +----------- sw/source/core/undo/undobj.cxx | 29 ++++++++++++++++ 6 files changed, 49 insertions(+), 24 deletions(-)
New commits: commit 2d89b9929e85bede4c72684a12e7508751875f0e Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Mon Jun 15 13:11:29 2020 +0200 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Mon Jun 15 15:58:59 2020 +0200 tdf#133957 sw: SelectAll should select fly in empty section Ctrl+A should select everything in the section; if the section is empty, there's no text to select, and then the shell will cancel the selection because SwCursorShell::HasSelection() returns false - so check if there are flys anchored there, which fixes the Copy. To fix Delete, a few more checks for empty selection need to be changed. Change-Id: If54160bdca976ad5f153b89cf8492f4da1e774b7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96324 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/sw/inc/undobj.hxx b/sw/inc/undobj.hxx index 91394446ccf7..bd6748d656a0 100644 --- a/sw/inc/undobj.hxx +++ b/sw/inc/undobj.hxx @@ -152,6 +152,9 @@ bool IsDestroyFrameAnchoredAtChar(SwPosition const & rAnchorPos, bool IsSelectFrameAnchoredAtPara(SwPosition const & rAnchorPos, SwPosition const & rStart, SwPosition const & rEnd, DelContentType const nDelContentType = DelContentType::AllMask); +/// check at-char and at-para flys in rDoc +bool IsFlySelectedByCursor(SwDoc const & rDoc, + SwPosition const & rStart, SwPosition const & rEnd); // This class has to be inherited into an Undo-object if it saves content // for Redo/Undo... diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 9407dd9d6629..042097a7e507 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -71,6 +71,7 @@ #include <vcl/uitest/eventdescription.hxx> #include <tabcol.hxx> #include <wrtsh.hxx> +#include <undobj.hxx> #include <boost/property_tree/json_parser.hpp> using namespace com::sun::star; @@ -2501,7 +2502,10 @@ void SwCursorShell::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) bool SwCursorShell::HasSelection() const { const SwPaM* pCursor = getShellCursor( true ); - return IsTableMode() || ( pCursor->HasMark() && *pCursor->GetPoint() != *pCursor->GetMark() ); + return IsTableMode() + || (pCursor->HasMark() && + (*pCursor->GetPoint() != *pCursor->GetMark() + || IsFlySelectedByCursor(*GetDoc(), *pCursor->Start(), *pCursor->End()))); } void SwCursorShell::CallChgLnk() diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index 12350ceb49d9..ebb7c988f04a 100644 --- a/sw/source/core/doc/DocumentContentOperationsManager.cxx +++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx @@ -4062,8 +4062,11 @@ bool DocumentContentOperationsManager::DeleteRangeImplImpl(SwPaM & rPam) { SwPosition *pStt = rPam.Start(), *pEnd = rPam.End(); - if( !rPam.HasMark() || *pStt >= *pEnd ) + if (!rPam.HasMark() + || (*pStt == *pEnd && !IsFlySelectedByCursor(m_rDoc, *pStt, *pEnd))) + { return false; + } if( m_rDoc.GetAutoCorrExceptWord() ) { diff --git a/sw/source/core/edit/eddel.cxx b/sw/source/core/edit/eddel.cxx index af9a8e4d5674..b32f72c5fa6d 100644 --- a/sw/source/core/edit/eddel.cxx +++ b/sw/source/core/edit/eddel.cxx @@ -24,6 +24,7 @@ #include <editsh.hxx> #include <pam.hxx> #include <swundo.hxx> +#include <undobj.hxx> #include <SwRewriter.hxx> #include <osl/diagnose.h> @@ -34,8 +35,12 @@ void SwEditShell::DeleteSel( SwPaM& rPam, bool* pUndo ) { bool bSelectAll = StartsWithTable() && ExtendedSelectedAll(); // only for selections - if( !rPam.HasMark() || *rPam.GetPoint() == *rPam.GetMark()) + if (!rPam.HasMark() + || (*rPam.GetPoint() == *rPam.GetMark() + && !IsFlySelectedByCursor(*GetDoc(), *rPam.Start(), *rPam.End()))) + { return; + } // Is the selection in a table? Then delete only the content of the selected boxes. // Here, there are two cases: diff --git a/sw/source/core/undo/undel.cxx b/sw/source/core/undo/undel.cxx index ba625d577f57..f285e8852f5b 100644 --- a/sw/source/core/undo/undel.cxx +++ b/sw/source/core/undo/undel.cxx @@ -561,28 +561,9 @@ bool SwUndoDelete::CanGrouping( SwDoc* pDoc, const SwPaM& rDelPam ) // tdf#132725 - if at-char/at-para flys would be deleted, don't group! // DelContentIndex() would be called at the wrong time here, the indexes // in the stored SwHistoryTextFlyCnt would be wrong when Undo is invoked - for (SwFrameFormat const*const pFly : *pDoc->GetSpzFrameFormats()) + if (IsFlySelectedByCursor(*pDoc, *pStt, *pEnd)) { - SwFormatAnchor const& rAnchor(pFly->GetAnchor()); - switch (rAnchor.GetAnchorId()) - { - case RndStdIds::FLY_AT_CHAR: - case RndStdIds::FLY_AT_PARA: - { - SwPosition const*const pAnchorPos(rAnchor.GetContentAnchor()); - // can this really be null? - if (pAnchorPos != nullptr - && ((rAnchor.GetAnchorId() == RndStdIds::FLY_AT_CHAR) - ? IsDestroyFrameAnchoredAtChar(*pAnchorPos, *pStt, *pEnd) - : IsSelectFrameAnchoredAtPara(*pAnchorPos, *pStt, *pEnd))) - { - return false; - } - } - break; - default: // other types not relevant - break; - } + return false; } { diff --git a/sw/source/core/undo/undobj.cxx b/sw/source/core/undo/undobj.cxx index 2b081f723368..aca9012898c9 100644 --- a/sw/source/core/undo/undobj.cxx +++ b/sw/source/core/undo/undobj.cxx @@ -1645,4 +1645,33 @@ bool IsSelectFrameAnchoredAtPara(SwPosition const & rAnchorPos, || (IsAtEndOfSection(rAnchorPos) && IsAtStartOfSection2(rStart))))); } +bool IsFlySelectedByCursor(SwDoc const & rDoc, + SwPosition const & rStart, SwPosition const & rEnd) +{ + for (SwFrameFormat const*const pFly : *rDoc.GetSpzFrameFormats()) + { + SwFormatAnchor const& rAnchor(pFly->GetAnchor()); + switch (rAnchor.GetAnchorId()) + { + case RndStdIds::FLY_AT_CHAR: + case RndStdIds::FLY_AT_PARA: + { + SwPosition const*const pAnchorPos(rAnchor.GetContentAnchor()); + // can this really be null? + if (pAnchorPos != nullptr + && ((rAnchor.GetAnchorId() == RndStdIds::FLY_AT_CHAR) + ? IsDestroyFrameAnchoredAtChar(*pAnchorPos, rStart, rEnd) + : IsSelectFrameAnchoredAtPara(*pAnchorPos, rStart, rEnd))) + { + return true; + } + } + break; + default: // other types not relevant + break; + } + } + return false; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits