1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SW_INC_SECTION_HXX
21 #define INCLUDED_SW_INC_SECTION_HXX
23 #include <com/sun/star/uno/Sequence.h>
24 #include <com/sun/star/text/XTextSection.hpp>
26 #include <tools/ref.hxx>
27 #include <svl/hint.hxx>
28 #include <svl/listener.hxx>
29 #include <sfx2/lnkbase.hxx>
30 #include <sfx2/Metadatable.hxx>
31 #include <unotools/weakref.hxx>
36 class SwSectionFormat
;
44 typedef std::vector
<SwSection
*> SwSections
;
46 enum class SectionType
{ Content
,
49 DdeLink
= static_cast<int>(sfx2::SvBaseLinkObjectType::ClientDde
),
50 FileLink
= static_cast<int>(sfx2::SvBaseLinkObjectType::ClientFile
)
53 enum class LinkCreateType
56 Connect
, // Connect created link.
57 Update
// Connect created link and update it.
60 class SW_DLLPUBLIC SwSectionData
65 OUString m_sSectionName
;
66 OUString m_sCondition
; ///< Hide condition
67 OUString m_sLinkFileName
;
68 OUString m_sLinkFilePassword
; // Must be changed to Sequence.
69 css::uno::Sequence
<sal_Int8
> m_Password
;
71 /// It seems this flag caches the current final "hidden" state.
72 bool m_bHiddenFlag
: 1;
73 /// Flags that correspond to attributes in the format:
74 /// may have different value than format attribute:
75 /// format attr has value for this section, while flag is
76 /// effectively ORed with parent sections!
77 bool m_bProtectFlag
: 1; ///< protect flag is no longer inherited
78 // Edit in readonly sections.
79 bool m_bEditInReadonlyFlag
: 1;
81 bool m_bHidden
: 1; ///< Section is hidden, unless condition evaluates `false'
82 bool m_bCondHiddenFlag
: 1; ///< Hide condition evaluated `true'
83 bool m_bConnectFlag
: 1; // Connected to server?
87 SwSectionData(SectionType
const eType
, OUString aName
);
88 explicit SwSectionData(SwSection
const&);
89 SwSectionData(SwSectionData
const&);
90 SwSectionData
& operator=(SwSectionData
const&);
91 bool operator==(SwSectionData
const&) const;
93 const OUString
& GetSectionName() const { return m_sSectionName
; }
94 void SetSectionName(OUString
const& rName
){ m_sSectionName
= rName
; }
95 SectionType
GetType() const { return m_eType
; }
96 void SetType(SectionType
const eNew
) { m_eType
= eNew
; }
98 bool IsHidden() const { return m_bHidden
; }
99 void SetHidden(bool const bFlag
) { m_bHidden
= bFlag
; }
101 bool IsHiddenFlag() const { return m_bHiddenFlag
; }
103 SetHiddenFlag(bool const bFlag
) { m_bHiddenFlag
= bFlag
; }
104 bool IsProtectFlag() const { return m_bProtectFlag
; }
106 SetProtectFlag(bool const bFlag
) { m_bProtectFlag
= bFlag
; }
107 bool IsEditInReadonlyFlag() const { return m_bEditInReadonlyFlag
; }
108 void SetEditInReadonlyFlag(bool const bFlag
)
109 { m_bEditInReadonlyFlag
= bFlag
; }
111 void SetCondHidden(bool const bFlag
) { m_bCondHiddenFlag
= bFlag
; }
112 bool IsCondHidden() const { return m_bCondHiddenFlag
; }
114 const OUString
& GetCondition() const { return m_sCondition
; }
115 void SetCondition(OUString
const& rNew
) { m_sCondition
= rNew
; }
117 const OUString
& GetLinkFileName() const { return m_sLinkFileName
; }
118 void SetLinkFileName(OUString
const& rNew
)
120 m_sLinkFileName
= rNew
;
123 const OUString
& GetLinkFilePassword() const { return m_sLinkFilePassword
; }
124 void SetLinkFilePassword(OUString
const& rS
){ m_sLinkFilePassword
= rS
; }
126 css::uno::Sequence
<sal_Int8
> const& GetPassword() const
127 { return m_Password
; }
128 void SetPassword(css::uno::Sequence
<sal_Int8
> const& rNew
)
129 { m_Password
= rNew
; }
130 bool IsLinkType() const
131 { return (SectionType::DdeLink
== m_eType
) || (SectionType::FileLink
== m_eType
); }
133 bool IsConnectFlag() const { return m_bConnectFlag
; }
134 void SetConnectFlag(bool const bFlag
){ m_bConnectFlag
= bFlag
; }
136 void dumpAsXml(xmlTextWriterPtr pWriter
) const;
139 class SW_DLLPUBLIC SwSection
141 , public SvtListener
// needed for SwClientNotify to be called from SwSectionFormat
143 // In order to correctly maintain the flag when creating/deleting frames.
144 friend class SwSectionNode
;
145 // The "read CTOR" of SwSectionFrame have to change the Hiddenflag.
146 friend class SwSectionFrame
;
149 mutable SwSectionData m_Data
;
151 tools::SvRef
<SwServerObject
> m_RefObj
; // Set if DataServer.
152 tools::SvRef
<sfx2::SvBaseLink
> m_RefLink
;
154 SAL_DLLPRIVATE
void ImplSetHiddenFlag(
155 bool const bHidden
, bool const bCondition
);
158 virtual void Notify(SfxHint
const& rHint
) override
;
159 virtual void SwClientNotify(const SwModify
&, const SfxHint
&) override
;
163 SwSection(SectionType
const eType
, OUString
const& rName
,
164 SwSectionFormat
& rFormat
);
165 virtual ~SwSection() override
;
167 bool DataEquals(SwSectionData
const& rCmp
) const;
169 void SetSectionData(SwSectionData
const& rData
);
171 const OUString
& GetSectionName() const { return m_Data
.GetSectionName(); }
172 void SetSectionName(OUString
const& rName
){ m_Data
.SetSectionName(rName
); }
173 SectionType
GetType() const { return m_Data
.GetType(); }
174 void SetType(SectionType
const eType
) { return m_Data
.SetType(eType
); }
176 inline SwSectionFormat
* GetFormat();
177 inline SwSectionFormat
const * GetFormat() const;
179 // Set hidden/protected -> update the whole tree!
180 // (Attributes/flags are set/get.)
181 bool IsHidden() const { return m_Data
.IsHidden(); }
182 void SetHidden (bool const bFlag
= true);
183 bool IsProtect() const;
184 void SetProtect(bool const bFlag
= true);
185 bool IsEditInReadonly() const;
186 void SetEditInReadonly(bool const bFlag
= true);
188 // Get internal flags (state including parents, not what is
189 // currently set at section!).
190 bool IsHiddenFlag() const { return m_Data
.IsHiddenFlag(); }
191 bool IsProtectFlag() const { return m_Data
.IsProtectFlag(); }
192 bool IsEditInReadonlyFlag() const { return m_Data
.IsEditInReadonlyFlag(); }
194 void SetCondHidden(bool const bFlag
);
195 bool IsCondHidden() const { return m_Data
.IsCondHidden(); }
196 // Query (also for parents) if this section is to be hidden.
197 bool CalcHiddenFlag() const;
199 inline SwSection
* GetParent() const;
201 OUString
const & GetCondition() const { return m_Data
.GetCondition(); }
202 void SetCondition(OUString
const& rNew
) { m_Data
.SetCondition(rNew
); }
204 OUString
const & GetLinkFileName() const;
205 void SetLinkFileName(OUString
const& rNew
);
206 // Password of linked file (only valid during runtime!)
207 OUString
const & GetLinkFilePassword() const
208 { return m_Data
.GetLinkFilePassword(); }
209 void SetLinkFilePassword(OUString
const& rS
)
210 { m_Data
.SetLinkFilePassword(rS
); }
212 // Get / set password of this section
213 css::uno::Sequence
<sal_Int8
> const& GetPassword() const
214 { return m_Data
.GetPassword(); }
216 // Data server methods.
217 void SetRefObject( SwServerObject
* pObj
);
218 const SwServerObject
* GetObject() const { return m_RefObj
.get(); }
219 SwServerObject
* GetObject() { return m_RefObj
.get(); }
220 bool IsServer() const { return m_RefObj
.is(); }
222 // Methods for linked ranges.
223 SfxLinkUpdateMode
GetUpdateType() const { return m_RefLink
->GetUpdateMode(); }
224 void SetUpdateType(SfxLinkUpdateMode nType
)
225 { m_RefLink
->SetUpdateMode(nType
); }
227 bool IsConnected() const { return m_RefLink
.is(); }
228 void UpdateNow() { m_RefLink
->Update(); }
229 void Disconnect() { m_RefLink
->Disconnect(); }
231 const ::sfx2::SvBaseLink
& GetBaseLink() const { return *m_RefLink
; }
232 ::sfx2::SvBaseLink
& GetBaseLink() { return *m_RefLink
; }
234 void CreateLink( LinkCreateType eType
);
236 static void MakeChildLinksVisible( const SwSectionNode
& rSectNd
);
238 bool IsLinkType() const { return m_Data
.IsLinkType(); }
240 // Flags for UI. Did connection work?
241 bool IsConnectFlag() const { return m_Data
.IsConnectFlag(); }
242 void SetConnectFlag(bool const bFlag
= true)
243 { m_Data
.SetConnectFlag(bFlag
); }
245 // Return the TOX base class if the section is a TOX section
246 const SwTOXBase
* GetTOXBase() const;
250 void dumpAsXml(xmlTextWriterPtr pWriter
) const;
254 class SwSectionFrameMoveAndDeleteHint final
: public SfxHint
257 SwSectionFrameMoveAndDeleteHint( const bool bSaveContent
)
258 : SfxHint( SfxHintId::SwSectionFrameMoveAndDelete
)
259 , mbSaveContent( bSaveContent
)
262 bool IsSaveContent() const
264 return mbSaveContent
;
268 const bool mbSaveContent
;
271 enum class SectionSort
{ Not
, Pos
};
273 class SW_DLLPUBLIC SwSectionFormat final
274 : public SwFrameFormat
275 , public ::sfx2::Metadatable
279 /** Why does this exist in addition to the m_wXObject in SwFrameFormat?
280 in case of an index, both a SwXDocumentIndex and a SwXTextSection
281 register at this SwSectionFormat, so we need to have two refs.
283 unotools::WeakReference
<SwXTextSection
> m_wXTextSection
;
285 SAL_DLLPRIVATE
void UpdateParent(); // Parent has been changed.
287 SwSectionFormat( SwFrameFormat
* pDrvdFrame
, SwDoc
*pDoc
);
288 virtual void SwClientNotify(const SwModify
&, const SfxHint
&) override
;
291 virtual ~SwSectionFormat() override
;
293 // Deletes all Frames in aDepend (Frames are recognized via dynamic_cast).
294 virtual void DelFrames() override
;
297 virtual void MakeFrames() override
;
299 // Get information from Format.
300 virtual bool GetInfo( SfxPoolItem
& ) const override
;
302 virtual bool IsVisible() const override
;
304 SwSection
* GetSection() const;
305 inline SwSectionFormat
* GetParent() const;
306 inline SwSection
* GetParentSection() const;
308 // All sections that are derived from this one:
309 // - sorted according to name or position or unsorted
310 // - all of them or only those that are in the normal Nodes-array.
311 void GetChildSections( SwSections
& rArr
,
312 SectionSort eSort
= SectionSort::Not
,
313 bool bAllSections
= true ) const;
315 // Query whether section is in Nodes-array or in UndoNodes-array.
316 bool IsInNodesArr() const;
318 SwSectionNode
* GetSectionNode();
319 const SwSectionNode
* GetSectionNode() const
320 { return const_cast<SwSectionFormat
*>(this)
321 ->GetSectionNode(); }
323 // Is section a valid one for global document?
324 const SwSection
* GetGlobalDocSection() const;
326 SAL_DLLPRIVATE
unotools::WeakReference
<SwXTextSection
> const& GetXTextSection() const
327 { return m_wXTextSection
; }
328 SAL_DLLPRIVATE
void SetXTextSection(rtl::Reference
<SwXTextSection
> const& xTextSection
);
331 virtual ::sfx2::IXmlIdRegistry
& GetRegistry() override
;
332 virtual bool IsInClipboard() const override
;
333 virtual bool IsInUndo() const override
;
334 virtual bool IsInContent() const override
;
335 virtual css::uno::Reference
< css::rdf::XMetadatable
> MakeUnoObject() override
;
336 virtual bool supportsFullDrawingLayerFillAttributeSet() const override
;
337 void dumpAsXml(xmlTextWriterPtr pWriter
) const;
341 SwSectionFormat
* SwSection::GetFormat()
343 return static_cast<SwSectionFormat
*>(GetRegisteredIn());
346 SwSectionFormat
const * SwSection::GetFormat() const
348 return static_cast<SwSectionFormat
const *>(GetRegisteredIn());
351 inline SwSection
* SwSection::GetParent() const
353 SwSectionFormat
const * pFormat
= GetFormat();
354 SwSection
* pRet
= nullptr;
356 pRet
= pFormat
->GetParentSection();
360 inline SwSectionFormat
* SwSectionFormat::GetParent() const
362 SwSectionFormat
* pRet
= nullptr;
363 if( GetRegisteredIn() )
364 pRet
= const_cast<SwSectionFormat
*>(dynamic_cast< const SwSectionFormat
* >( GetRegisteredIn() ));
368 inline SwSection
* SwSectionFormat::GetParentSection() const
370 SwSectionFormat
* pParent
= GetParent();
371 SwSection
* pRet
= nullptr;
374 pRet
= pParent
->GetSection();
379 #endif /* _ INCLUDED_SW_INC_SECTION_HXX */
381 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */