diff options
author | Daniel Arato (NISZ) <arato.daniel@nisz.hu> | 2021-01-26 13:11:42 +0100 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2021-03-02 11:10:29 +0100 |
commit | f5dc6b11d2218d94c9effe7a1ab418d0133da5e3 (patch) | |
tree | e2060ae00cd846278e49b554f502d59274a498dc /sw/source/core/doc/docdesc.cxx | |
parent | 3fe274dcfeca17ee7713b306fcd36183f6cf4689 (diff) |
tdf#140117 sw UI: keep headers/footers when inactive
Custom left page and first headers (and footers) used to disappear
forever if hidden temporarily by checking the "Same content on left
and right pages" or "Same content on first page" options, respectively.
This commit stashes the endangered headers (footers) in SwPageDesc
and restores them on demand.
Change-Id: I1f6b605e2bd19af18726de1b825721487d29b4eb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110398
Tested-by: Jenkins
Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'sw/source/core/doc/docdesc.cxx')
-rw-r--r-- | sw/source/core/doc/docdesc.cxx | 70 |
1 files changed, 56 insertions, 14 deletions
diff --git a/sw/source/core/doc/docdesc.cxx b/sw/source/core/doc/docdesc.cxx index bd5308e27790..87a99ff13f84 100644 --- a/sw/source/core/doc/docdesc.cxx +++ b/sw/source/core/doc/docdesc.cxx @@ -433,38 +433,80 @@ void SwDoc::ChgPageDesc( size_t i, const SwPageDesc &rChged ) bool bHeaderFooterChanged = false; // Synch header. - const SwFormatHeader &rHead = rChged.GetMaster().GetHeader(); + const SwFormatHeader& rMasterHead = rChged.GetMaster().GetHeader(); + const SwFormatHeader& rLeftHead = rChged.GetLeft().GetHeader(); + const SwFormatHeader& rFirstMasterHead = rChged.GetFirstMaster().GetHeader(); + const SwFormatHeader& rFirstLeftHead = rChged.GetFirstLeft().GetHeader(); if (undoGuard.UndoWasEnabled()) { // #i46909# no undo if header or footer changed // Did something change in the nodes? - const SwFormatHeader &rOldHead = rDesc.GetMaster().GetHeader(); + const SwFormatHeader &rOldMasterHead = rDesc.GetMaster().GetHeader(); bHeaderFooterChanged |= - ( rHead.IsActive() != rOldHead.IsActive() || + ( rMasterHead.IsActive() != rOldMasterHead.IsActive() || rChged.IsHeaderShared() != rDesc.IsHeaderShared() || rChged.IsFirstShared() != rDesc.IsFirstShared() ); } - rDesc.GetMaster().SetFormatAttr( rHead ); - CopyMasterHeader(rChged, rHead, rDesc, true, false); // Copy left header - CopyMasterHeader(rChged, rHead, rDesc, false, true); // Copy first master - CopyMasterHeader(rChged, rHead, rDesc, true, true); // Copy first left + rDesc.GetMaster().SetFormatAttr( rMasterHead ); + const bool bRestoreStashedLeftHead = rDesc.IsHeaderShared() && !rChged.IsHeaderShared(); + const bool bRestoreStashedFirstMasterHead = rDesc.IsFirstShared() && !rChged.IsFirstShared(); + const bool bRestoreStashedFirstLeftHead = (rDesc.IsHeaderShared() && !rChged.IsHeaderShared()) || (rDesc.IsFirstShared() && !rChged.IsFirstShared()); + const SwFrameFormat* pStashedLeftFormat = bRestoreStashedLeftHead ? rChged.GetStashedFrameFormat(true, true, false) : nullptr; + const SwFrameFormat* pStashedFirstMasterFormat = bRestoreStashedFirstMasterHead ? rChged.GetStashedFrameFormat(true, false, true) : nullptr; + const SwFrameFormat* pStashedFirstLeftFormat = bRestoreStashedFirstLeftHead ? rChged.GetStashedFrameFormat(true, true, true) : nullptr; + CopyMasterHeader(rChged, pStashedLeftFormat ? pStashedLeftFormat->GetHeader() : rMasterHead, rDesc, true, false); // Copy left header + CopyMasterHeader(rChged, pStashedFirstMasterFormat ? pStashedFirstMasterFormat->GetHeader() : rMasterHead, rDesc, false, true); // Copy first master + CopyMasterHeader(rChged, pStashedFirstLeftFormat ? pStashedFirstLeftFormat->GetHeader() : rMasterHead, rDesc, true, true); // Copy first left + + // Stash header formats as needed. + const bool bStashLeftHead = !rDesc.IsHeaderShared() && rChged.IsHeaderShared(); + const bool bStashFirstMasterHead = !rDesc.IsFirstShared() && rChged.IsFirstShared(); + const bool bStashFirstLeftHead = (!rDesc.IsHeaderShared() && rChged.IsHeaderShared()) || (!rDesc.IsFirstShared() && rChged.IsFirstShared()); + if (rLeftHead.GetRegisteredIn() && bStashLeftHead) + rDesc.StashFrameFormat(rChged.GetLeft(), true, true, false); + if (rFirstMasterHead.GetRegisteredIn() && bStashFirstMasterHead) + rDesc.StashFrameFormat(rChged.GetFirstMaster(), true, false, true); + if (rFirstLeftHead.GetRegisteredIn() && bStashFirstLeftHead) + rDesc.StashFrameFormat(rChged.GetFirstLeft(), true, true, true); + rDesc.ChgHeaderShare( rChged.IsHeaderShared() ); // Synch Footer. - const SwFormatFooter &rFoot = rChged.GetMaster().GetFooter(); + const SwFormatFooter& rMasterFoot = rChged.GetMaster().GetFooter(); + const SwFormatFooter& rLeftFoot = rChged.GetLeft().GetFooter(); + const SwFormatFooter& rFirstMasterFoot = rChged.GetFirstMaster().GetFooter(); + const SwFormatFooter& rFirstLeftFoot = rChged.GetFirstLeft().GetFooter(); if (undoGuard.UndoWasEnabled()) { // #i46909# no undo if header or footer changed // Did something change in the Nodes? - const SwFormatFooter &rOldFoot = rDesc.GetMaster().GetFooter(); + const SwFormatFooter &rOldMasterFoot = rDesc.GetMaster().GetFooter(); bHeaderFooterChanged |= - ( rFoot.IsActive() != rOldFoot.IsActive() || + ( rMasterFoot.IsActive() != rOldMasterFoot.IsActive() || rChged.IsFooterShared() != rDesc.IsFooterShared() ); } - rDesc.GetMaster().SetFormatAttr( rFoot ); - CopyMasterFooter(rChged, rFoot, rDesc, true, false); // Copy left footer - CopyMasterFooter(rChged, rFoot, rDesc, false, true); // Copy first master - CopyMasterFooter(rChged, rFoot, rDesc, true, true); // Copy first left + rDesc.GetMaster().SetFormatAttr( rMasterFoot ); + const bool bRestoreStashedLeftFoot = rDesc.IsFooterShared() && !rChged.IsFooterShared(); + const bool bRestoreStashedFirstMasterFoot = rDesc.IsFirstShared() && !rChged.IsFirstShared(); + const bool bRestoreStashedFirstLeftFoot = (rDesc.IsFooterShared() && !rChged.IsFooterShared()) || (rDesc.IsFirstShared() && !rChged.IsFirstShared()); + const SwFrameFormat* pStashedLeftFoot = bRestoreStashedLeftFoot ? rChged.GetStashedFrameFormat(false, true, false) : nullptr; + const SwFrameFormat* pStashedFirstMasterFoot = bRestoreStashedFirstMasterFoot ? rChged.GetStashedFrameFormat(false, false, true) : nullptr; + const SwFrameFormat* pStashedFirstLeftFoot = bRestoreStashedFirstLeftFoot ? rChged.GetStashedFrameFormat(false, true, true) : nullptr; + CopyMasterFooter(rChged, pStashedLeftFoot ? pStashedLeftFoot->GetFooter() : rMasterFoot, rDesc, true, false); // Copy left footer + CopyMasterFooter(rChged, pStashedFirstMasterFoot ? pStashedFirstMasterFoot->GetFooter() : rMasterFoot, rDesc, false, true); // Copy first master + CopyMasterFooter(rChged, pStashedFirstLeftFoot ? pStashedFirstLeftFoot->GetFooter() : rMasterFoot, rDesc, true, true); // Copy first left + + // Stash footer formats as needed. + const bool bStashLeftFoot = !rDesc.IsFooterShared() && rChged.IsFooterShared(); + const bool bStashFirstMasterFoot = !rDesc.IsFirstShared() && rChged.IsFirstShared(); + const bool bStashFirstLeftFoot = (!rDesc.IsFooterShared() && rChged.IsFooterShared()) || (!rDesc.IsFirstShared() && rChged.IsFirstShared()); + if (rLeftFoot.GetRegisteredIn() && bStashLeftFoot) + rDesc.StashFrameFormat(rChged.GetLeft(), false, true, false); + if (rFirstMasterFoot.GetRegisteredIn() && bStashFirstMasterFoot) + rDesc.StashFrameFormat(rChged.GetFirstMaster(), false, false, true); + if (rFirstLeftFoot.GetRegisteredIn() && bStashFirstLeftFoot) + rDesc.StashFrameFormat(rChged.GetFirstLeft(), false, true, true); + rDesc.ChgFooterShare( rChged.IsFooterShared() ); // there is just one first shared flag for both header and footer? rDesc.ChgFirstShare( rChged.IsFirstShared() ); |