summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2020-06-15 13:11:29 +0200
committerMichael Stahl <michael.stahl@cib.de>2020-06-16 14:42:51 +0200
commit1ad7ff8affaba315c8f28a43a18d51c803eb78bc (patch)
tree45188e0051bd89226ce82cdb31f45da5eed177b1 /sw
parentf10fc1dbb3472abffea3fea8b8f19909f6a06d99 (diff)
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.stahl@cib.de> (cherry picked from commit 2d89b9929e85bede4c72684a12e7508751875f0e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96342
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/undobj.hxx3
-rw-r--r--sw/source/core/crsr/crsrsh.cxx6
-rw-r--r--sw/source/core/doc/DocumentContentOperationsManager.cxx5
-rw-r--r--sw/source/core/edit/eddel.cxx7
-rw-r--r--sw/source/core/undo/undel.cxx23
-rw-r--r--sw/source/core/undo/undobj.cxx29
6 files changed, 49 insertions, 24 deletions
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 014c515a81f0..7a0c3b88113c 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;
@@ -2500,7 +2501,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 4151f9d6b562..dc262426ff1e 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -4060,8 +4060,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 0075dd380ccc..3a17d8d98f21 100644
--- a/sw/source/core/undo/undobj.cxx
+++ b/sw/source/core/undo/undobj.cxx
@@ -1644,4 +1644,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: */