summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorJustin Luth <justin.luth@collabora.com>2020-12-19 16:20:46 +0300
committerMiklos Vajna <vmiklos@collabora.com>2020-12-22 16:56:09 +0100
commit6156a419a2d3f09d91afd00f84c84ba717442f43 (patch)
tree7944886b6f551e327bb70e0fe7e4f075442f98d5 /sw
parent0b3c9cb1e4db57f1a93bf57cd5251d3ac931c8e4 (diff)
tdf#136578 sw BreakDashedLine: edit/delete PageAfter
When you click on the blue dashed line indicating a page break, that delete should remove both that page's break-before, and the previous paragraph's break-after. Also, edit should detect if a break comes from a PageAfter. Prior to this commit, multiple things were wrong: -the previous paragraph wasn't checked, so PageAfter breaks were not deleted. -edit looked at the wrong para if break was PageAfter. -the current paragraph's PageAfter was deleted - deleting the NEXT page break, and not THIS one. I hope only tables are the exception to the rule. It doesn't seem to matter which table pNd is set with the NONE'd break. In theory, I could edit the real GetBreakItem functions to add in that code, but that seems very dangerous at this low of a level. Prior commit d7dfae214384f37901b532618e4d3ef117bd0285 flattened this function and did other minor cleanup. Change-Id: I9944c25853ec206f9febb6ea9f4e34c13c770ebb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108072 Tested-by: Jenkins Reviewed-by: Justin Luth <justin_luth@sil.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'sw')
-rw-r--r--sw/source/uibase/docvw/PageBreakWin.cxx49
1 files changed, 48 insertions, 1 deletions
diff --git a/sw/source/uibase/docvw/PageBreakWin.cxx b/sw/source/uibase/docvw/PageBreakWin.cxx
index 5b405d329200..2bd4eaa8abc7 100644
--- a/sw/source/uibase/docvw/PageBreakWin.cxx
+++ b/sw/source/uibase/docvw/PageBreakWin.cxx
@@ -25,6 +25,7 @@
#include <PostItMgr.hxx>
#include <FrameControlsManager.hxx>
#include <strings.hrc>
+#include <tabfrm.hxx>
#include <uiitems.hxx>
#include <view.hxx>
#include <viewopt.hxx>
@@ -221,11 +222,37 @@ void SwPageBreakWin::PaintButton()
m_xMenuButton->set_custom_button(m_xVirDev.get());
}
+static SvxBreak lcl_GetBreakItem(const SwContentFrame* pCnt)
+{
+ SvxBreak eBreak = SvxBreak::NONE;
+ if ( pCnt )
+ {
+ if ( pCnt->IsInTab() )
+ eBreak = pCnt->FindTabFrame()->GetBreakItem().GetBreak();
+ else
+ eBreak = pCnt->GetBreakItem().GetBreak();
+ }
+ return eBreak;
+}
+
IMPL_LINK(SwPageBreakWin, SelectHdl, const OString&, rIdent, void)
{
SwFrameControlPtr pThis = GetEditWin()->GetFrameControlsManager( ).GetControl( FrameControlType::PageBreak, GetFrame() );
+ // Is there a PageBefore break on this page?
SwContentFrame *pCnt = const_cast<SwContentFrame*>(GetPageFrame()->FindFirstBodyContent());
+ SvxBreak eBreak = lcl_GetBreakItem( pCnt );
+
+ // Also check the previous page - to see if there is a PageAfter break
+ SwContentFrame *pPrevCnt = nullptr;
+ SvxBreak ePrevBreak = SvxBreak::NONE;
+ const SwPageFrame* pPrevPage = static_cast<const SwPageFrame*>(GetPageFrame()->GetPrev());
+ if ( pPrevPage )
+ {
+ pPrevCnt = const_cast<SwContentFrame*>(pPrevPage->FindLastBodyContent());
+ ePrevBreak = lcl_GetBreakItem( pPrevCnt );
+ }
+
if (pCnt && rIdent == "edit")
{
SwEditWin* pEditWin = GetEditWin();
@@ -234,6 +261,10 @@ IMPL_LINK(SwPageBreakWin, SelectHdl, const OString&, rIdent, void)
bool bOldLock = rSh.IsViewLocked();
rSh.LockView( true );
+ // Order of edit detection: first RES_BREAK PageAfter, then RES_BREAK PageBefore/RES_PAGEDESC
+ if ( ePrevBreak == SvxBreak::PageAfter )
+ pCnt = pPrevCnt;
+
SwContentNode& rNd = pCnt->IsTextFrame()
? *static_cast<SwTextFrame*>(pCnt)->GetTextNodeFirst()
: *static_cast<SwNoTextFrame*>(pCnt)->GetNode();
@@ -277,13 +308,29 @@ IMPL_LINK(SwPageBreakWin, SelectHdl, const OString&, rIdent, void)
SfxItemSet aSet(
GetEditWin()->GetView().GetWrtShell().GetAttrPool(),
svl::Items<RES_PAGEDESC, RES_BREAK>{});
- aSet.Put( SvxFormatBreakItem( SvxBreak::NONE, RES_BREAK ) );
+
aSet.Put( SwFormatPageDesc( nullptr ) );
+ // This break could be from the current paragraph, if it has a PageBefore break.
+ if ( eBreak == SvxBreak::PageBefore )
+ aSet.Put( SvxFormatBreakItem( SvxBreak::NONE, RES_BREAK ) );
SwPaM aPaM( rNd );
rNd.GetDoc().getIDocumentContentOperations().InsertItemSet(
aPaM, aSet, SetAttrMode::DEFAULT, GetPageFrame()->getRootFrame());
+ // This break could be from the previous paragraph, if it has a PageAfter break.
+ if ( ePrevBreak == SvxBreak::PageAfter )
+ {
+ SwContentNode& rPrevNd = pPrevCnt->IsTextFrame()
+ ? *static_cast<SwTextFrame*>(pPrevCnt)->GetTextNodeFirst()
+ : *static_cast<SwNoTextFrame*>(pPrevCnt)->GetNode();
+ aSet.ClearItem();
+ aSet.Put( SvxFormatBreakItem( SvxBreak::NONE, RES_BREAK ) );
+ aPaM = SwPaM( rPrevNd );
+ rPrevNd.GetDoc().getIDocumentContentOperations().InsertItemSet(
+ aPaM, aSet, SetAttrMode::DEFAULT, pPrevCnt->getRootFrame());
+ }
+
rNd.GetDoc().GetIDocumentUndoRedo( ).EndUndo( SwUndoId::UI_DELETE_PAGE_BREAK, nullptr );
}