diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2023-01-24 15:32:29 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2023-01-24 15:50:45 +0000 |
commit | 0bb90afaeb193181d7b98b79e962549d8a1dd85a (patch) | |
tree | 05e7bad5eab68cd82e37c44b4608315279337536 /sw | |
parent | 413bd0a96b010feb10dc3d76efa266ea082de006 (diff) |
sw: add document model for multi-page fly frames
Currently we can have multi-page tables and fly frames (where the
content wraps around the fly frame), but not both at the same time.
Allowing multi-page fly frames in general would probably go too far, but
handling this in case the fly frame only contains a table would make
sense to support Word's multi-page floating tables.
Fix this by adding a new SwFormatFlySplit property on fly frames: this
is meant to be enabled when the fly frame is part of a multi-page
floating table.
Unlike table split, this is off by default. Some logic will be needed
later to enable this in case the fly frame originates from a Word
floating table. (And obvously this is just the doc model, everything
else still needs doing.)
Change-Id: Id92130c684016cd7e7153e15b0ec6821e4471879
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146095
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'sw')
-rw-r--r-- | sw/Library_sw.mk | 1 | ||||
-rw-r--r-- | sw/inc/format.hxx | 1 | ||||
-rw-r--r-- | sw/inc/formatflysplit.hxx | 52 | ||||
-rw-r--r-- | sw/inc/hintids.hxx | 53 | ||||
-rw-r--r-- | sw/inc/swatrset.hxx | 2 | ||||
-rw-r--r-- | sw/qa/core/attr/attr.cxx | 23 | ||||
-rw-r--r-- | sw/source/core/attr/formatflysplit.cxx | 39 | ||||
-rw-r--r-- | sw/source/core/bastyp/init.cxx | 5 |
8 files changed, 148 insertions, 28 deletions
diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk index fa2ca1663512..05dd36258649 100644 --- a/sw/Library_sw.mk +++ b/sw/Library_sw.mk @@ -138,6 +138,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\ sw/source/core/attr/fmtfollowtextflow \ sw/source/core/attr/fmtwrapinfluenceonobjpos \ sw/source/core/attr/format \ + sw/source/core/attr/formatflysplit \ sw/source/core/attr/hints \ sw/source/core/attr/swatrset \ sw/source/core/bastyp/SwSmartTagMgr \ diff --git a/sw/inc/format.hxx b/sw/inc/format.hxx index f9dcb30b2874..c5b599d36d31 100644 --- a/sw/inc/format.hxx +++ b/sw/inc/format.hxx @@ -233,6 +233,7 @@ public: inline const SwFormatEditInReadonly &GetEditInReadonly( bool = true ) const; inline const SwFormatLayoutSplit &GetLayoutSplit( bool = true ) const; inline const SwFormatRowSplit &GetRowSplit( bool = true ) const; + inline const SwFormatFlySplit &GetFlySplit( bool = true ) const; inline const SwFormatChain &GetChain( bool = true ) const; inline const SwFormatFootnoteAtTextEnd &GetFootnoteAtTextEnd( bool = true ) const; inline const SwFormatEndAtTextEnd &GetEndAtTextEnd( bool = true ) const; diff --git a/sw/inc/formatflysplit.hxx b/sw/inc/formatflysplit.hxx new file mode 100644 index 000000000000..a7cbb82847bb --- /dev/null +++ b/sw/inc/formatflysplit.hxx @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <svl/eitem.hxx> + +#include "swdllapi.h" +#include "hintids.hxx" +#include "format.hxx" + +/// Determines if a fly frame can be split across multiple pages. +class SW_DLLPUBLIC SwFormatFlySplit final : public SfxBoolItem +{ +public: + SwFormatFlySplit(bool bSplit = false) + : SfxBoolItem(RES_FLY_SPLIT, bSplit) + { + } + + SwFormatFlySplit* Clone(SfxItemPool* pPool = nullptr) const override; + + void dumpAsXml(xmlTextWriterPtr pWriter) const override; +}; + +inline const SwFormatFlySplit& SwAttrSet::GetFlySplit(bool bInP) const +{ + return Get(RES_FLY_SPLIT, bInP); +} + +inline const SwFormatFlySplit& SwFormat::GetFlySplit(bool bInP) const +{ + return m_aSet.GetFlySplit(bInP); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx index e2392cf0007e..8d0c14f23572 100644 --- a/sw/inc/hintids.hxx +++ b/sw/inc/hintids.hxx @@ -116,6 +116,7 @@ class SwFormatLineNumber; class SwFormatNoBalancedColumns; class SwFormatPageDesc; class SwFormatRowSplit; +class SwFormatFlySplit; class SwFormatSurround; class SwFormatURL; class SwFormatVertOrient; @@ -358,35 +359,35 @@ constexpr TypedWhichId<SwFormatNoBalancedColumns> RES_COLUMNBALANCE(119); constexpr TypedWhichId<SvxFrameDirectionItem> RES_FRAMEDIR(120); constexpr TypedWhichId<SwHeaderAndFooterEatSpacingItem> RES_HEADER_FOOTER_EAT_SPACING(121); constexpr TypedWhichId<SwFormatRowSplit> RES_ROW_SPLIT(122); -constexpr TypedWhichId<SwFormatFollowTextFlow> RES_FOLLOW_TEXT_FLOW(123); -constexpr TypedWhichId<SfxBoolItem> RES_COLLAPSING_BORDERS(124); -constexpr TypedWhichId<SwFormatWrapInfluenceOnObjPos> RES_WRAP_INFLUENCE_ON_OBJPOS(125); -constexpr TypedWhichId<SwFormatAutoFormat> RES_AUTO_STYLE(126); -constexpr TypedWhichId<SfxStringItem> RES_FRMATR_STYLE_NAME(127); -constexpr TypedWhichId<SfxStringItem> RES_FRMATR_CONDITIONAL_STYLE_NAME(128); -constexpr TypedWhichId<SfxGrabBagItem> RES_FRMATR_GRABBAG(129); -constexpr TypedWhichId<SdrTextVertAdjustItem> RES_TEXT_VERT_ADJUST(130); -constexpr TypedWhichId<SfxBoolItem> RES_BACKGROUND_FULL_SIZE(131); -constexpr TypedWhichId<SfxBoolItem> RES_RTL_GUTTER(132); -constexpr TypedWhichId<SfxBoolItem> RES_DECORATIVE(133); -constexpr sal_uInt16 RES_FRMATR_END(134); +constexpr TypedWhichId<SwFormatFlySplit> RES_FLY_SPLIT(123); +constexpr TypedWhichId<SwFormatFollowTextFlow> RES_FOLLOW_TEXT_FLOW(124); +constexpr TypedWhichId<SfxBoolItem> RES_COLLAPSING_BORDERS(125); +constexpr TypedWhichId<SwFormatWrapInfluenceOnObjPos> RES_WRAP_INFLUENCE_ON_OBJPOS(126); +constexpr TypedWhichId<SwFormatAutoFormat> RES_AUTO_STYLE(127); +constexpr TypedWhichId<SfxStringItem> RES_FRMATR_STYLE_NAME(128); +constexpr TypedWhichId<SfxStringItem> RES_FRMATR_CONDITIONAL_STYLE_NAME(129); +constexpr TypedWhichId<SfxGrabBagItem> RES_FRMATR_GRABBAG(130); +constexpr TypedWhichId<SdrTextVertAdjustItem> RES_TEXT_VERT_ADJUST(131); +constexpr TypedWhichId<SfxBoolItem> RES_BACKGROUND_FULL_SIZE(132); +constexpr TypedWhichId<SfxBoolItem> RES_RTL_GUTTER(133); +constexpr TypedWhichId<SfxBoolItem> RES_DECORATIVE(134); +constexpr sal_uInt16 RES_FRMATR_END(135); constexpr sal_uInt16 RES_GRFATR_BEGIN(RES_FRMATR_END); constexpr TypedWhichId<SwMirrorGrf> RES_GRFATR_MIRRORGRF(RES_GRFATR_BEGIN); -constexpr TypedWhichId<SwCropGrf> RES_GRFATR_CROPGRF(135); - -constexpr TypedWhichId<SwRotationGrf> RES_GRFATR_ROTATION(136); -constexpr TypedWhichId<SwLuminanceGrf> RES_GRFATR_LUMINANCE(137); -constexpr TypedWhichId<SwContrastGrf> RES_GRFATR_CONTRAST(138); -constexpr TypedWhichId<SwChannelRGrf> RES_GRFATR_CHANNELR(139); -constexpr TypedWhichId<SwChannelGGrf> RES_GRFATR_CHANNELG(140); -constexpr TypedWhichId<SwChannelBGrf> RES_GRFATR_CHANNELB(141); -constexpr TypedWhichId<SwGammaGrf> RES_GRFATR_GAMMA(142); -constexpr TypedWhichId<SwInvertGrf> RES_GRFATR_INVERT(143); -constexpr TypedWhichId<SwTransparencyGrf> RES_GRFATR_TRANSPARENCY(144); -constexpr TypedWhichId<SwDrawModeGrf> RES_GRFATR_DRAWMODE(145); - -constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_DUMMY2(146); +constexpr TypedWhichId<SwCropGrf> RES_GRFATR_CROPGRF(136); + +constexpr TypedWhichId<SwRotationGrf> RES_GRFATR_ROTATION(137); +constexpr TypedWhichId<SwLuminanceGrf> RES_GRFATR_LUMINANCE(138); +constexpr TypedWhichId<SwContrastGrf> RES_GRFATR_CONTRAST(139); +constexpr TypedWhichId<SwChannelRGrf> RES_GRFATR_CHANNELR(140); +constexpr TypedWhichId<SwChannelGGrf> RES_GRFATR_CHANNELG(141); +constexpr TypedWhichId<SwChannelBGrf> RES_GRFATR_CHANNELB(142); +constexpr TypedWhichId<SwGammaGrf> RES_GRFATR_GAMMA(143); +constexpr TypedWhichId<SwInvertGrf> RES_GRFATR_INVERT(144); +constexpr TypedWhichId<SwTransparencyGrf> RES_GRFATR_TRANSPARENCY(145); +constexpr TypedWhichId<SwDrawModeGrf> RES_GRFATR_DRAWMODE(146); + constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_DUMMY3(147); constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_DUMMY4(148); constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_DUMMY5(149); diff --git a/sw/inc/swatrset.hxx b/sw/inc/swatrset.hxx index 1129914b378b..6fd2662186d8 100644 --- a/sw/inc/swatrset.hxx +++ b/sw/inc/swatrset.hxx @@ -81,6 +81,7 @@ class SwFormatLineNumber; class SwFormatEditInReadonly; class SwFormatLayoutSplit; class SwFormatRowSplit; +class SwFormatFlySplit; class SwFormatChain; class SwFormatFootnoteAtTextEnd; class SwFormatEndAtTextEnd; @@ -262,6 +263,7 @@ public: inline const SwFormatEditInReadonly &GetEditInReadonly( bool = true ) const; inline const SwFormatLayoutSplit &GetLayoutSplit( bool = true ) const; inline const SwFormatRowSplit &GetRowSplit( bool = true ) const; + inline const SwFormatFlySplit &GetFlySplit( bool = true ) const; inline const SwFormatChain &GetChain( bool = true ) const; inline const SwFormatLineNumber &GetLineNumber( bool = true ) const; inline const SwFormatFootnoteAtTextEnd &GetFootnoteAtTextEnd( bool = true ) const; diff --git a/sw/qa/core/attr/attr.cxx b/sw/qa/core/attr/attr.cxx index 3ba2a3b9a1eb..25d2a8025020 100644 --- a/sw/qa/core/attr/attr.cxx +++ b/sw/qa/core/attr/attr.cxx @@ -12,6 +12,9 @@ #include <docsh.hxx> #include <swdtflvr.hxx> #include <swmodule.hxx> +#include <frmmgr.hxx> +#include <frameformats.hxx> +#include <formatflysplit.hxx> namespace { @@ -50,6 +53,26 @@ CPPUNIT_TEST_FIXTURE(Test, testSwAttrSet) CPPUNIT_ASSERT(aData.hasValue()); pMod->m_pXSelection = pOldTransferable; } + +CPPUNIT_TEST_FIXTURE(Test, testFormatFlySplit) +{ + createSwDoc(); + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + SwFlyFrameAttrMgr aMgr(true, pWrtShell, Frmmgr_Type::TEXT, nullptr); + RndStdIds eAnchor = RndStdIds::FLY_AT_PARA; + aMgr.InsertFlyFrame(eAnchor, aMgr.GetPos(), aMgr.GetSize()); + SwDoc* pDoc = getSwDoc(); + SwFrameFormats& rFlys = *pDoc->GetSpzFrameFormats(); + SwFrameFormat* pFly = rFlys[0]; + CPPUNIT_ASSERT(!pFly->GetAttrSet().GetFlySplit().GetValue()); + + SfxItemSet aSet(pFly->GetAttrSet()); + SwFormatFlySplit aItem(true); + aSet.Put(aItem); + pDoc->SetFlyFrameAttr(*pFly, aSet); + + CPPUNIT_ASSERT(pFly->GetAttrSet().GetFlySplit().GetValue()); +} } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/attr/formatflysplit.cxx b/sw/source/core/attr/formatflysplit.cxx new file mode 100644 index 000000000000..72816b2ead4e --- /dev/null +++ b/sw/source/core/attr/formatflysplit.cxx @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <formatflysplit.hxx> + +#include <libxml/xmlwriter.h> + +SwFormatFlySplit* SwFormatFlySplit::Clone(SfxItemPool*) const +{ + return new SwFormatFlySplit(*this); +} + +void SwFormatFlySplit::dumpAsXml(xmlTextWriterPtr pWriter) const +{ + (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwFormatFlySplit")); + (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), + BAD_CAST(OString::number(Which()).getStr())); + (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("value"), + BAD_CAST(OString::boolean(GetValue()).getStr())); + (void)xmlTextWriterEndElement(pWriter); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/bastyp/init.cxx b/sw/source/core/bastyp/init.cxx index a7e1a41db639..4f7ee52b7ab6 100644 --- a/sw/source/core/bastyp/init.cxx +++ b/sw/source/core/bastyp/init.cxx @@ -105,6 +105,7 @@ #include <fmtpdsc.hxx> #include <fmtrfmrk.hxx> #include <fmtrowsplt.hxx> +#include <formatflysplit.hxx> #include <fmtruby.hxx> #include <fmtsrnd.hxx> #include <fmturl.hxx> @@ -391,6 +392,7 @@ SfxItemInfo aSlotTab[] = { SID_ATTR_HDFT_DYNAMIC_SPACING, true },// RES_HEADER_FOOTER_EAT_SPACING { FN_TABLE_ROW_SPLIT, true }, // RES_ROW_SPLIT + { 0, true } , // RES_FLY_SPLIT // #i18732# - use slot-id define in svx { SID_SW_FOLLOW_TEXT_FLOW, true }, // RES_FOLLOW_TEXT_FLOW // #i29550# @@ -417,7 +419,6 @@ SfxItemInfo aSlotTab[] = { 0, true }, // RES_GRFATR_GAMMA, { 0, true }, // RES_GRFATR_INVERT, { 0, true }, // RES_GRFATR_TRANSPARENCY, - { 0, true }, // RES_GRFATR_DUMMY2, { 0, true }, // RES_GRFATR_DUMMY3, { 0, true }, // RES_GRFATR_DUMMY4, { 0, true }, // RES_GRFATR_DUMMY5, @@ -593,6 +594,7 @@ void InitCore() aAttrTab[ RES_COLUMNBALANCE - POOLATTR_BEGIN ] = new SwFormatNoBalancedColumns; aAttrTab[ RES_FRAMEDIR - POOLATTR_BEGIN ] = new SvxFrameDirectionItem( SvxFrameDirection::Environment, RES_FRAMEDIR ); aAttrTab[ RES_ROW_SPLIT - POOLATTR_BEGIN ] = new SwFormatRowSplit; + aAttrTab[ RES_FLY_SPLIT - POOLATTR_BEGIN ] = new SwFormatFlySplit; // #i18732# aAttrTab[ RES_FOLLOW_TEXT_FLOW - POOLATTR_BEGIN ] = new SwFormatFollowTextFlow(false); @@ -625,7 +627,6 @@ void InitCore() aAttrTab[ RES_GRFATR_DRAWMODE - POOLATTR_BEGIN ] = new SwDrawModeGrf; // GraphicAttr - Dummies - aAttrTab[ RES_GRFATR_DUMMY2 - POOLATTR_BEGIN ] = new SfxBoolItem( RES_GRFATR_DUMMY2 ); aAttrTab[ RES_GRFATR_DUMMY3 - POOLATTR_BEGIN ] = new SfxBoolItem( RES_GRFATR_DUMMY3 ); aAttrTab[ RES_GRFATR_DUMMY4 - POOLATTR_BEGIN ] = new SfxBoolItem( RES_GRFATR_DUMMY4 ); aAttrTab[ RES_GRFATR_DUMMY5 - POOLATTR_BEGIN ] = new SfxBoolItem( RES_GRFATR_DUMMY5 ); |