/* -*- 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 .
*/
#ifndef INCLUDED_SW_INC_SECTION_HXX
#define INCLUDED_SW_INC_SECTION_HXX
#include <com/sun/star/uno/Sequence.h>
#include <com/sun/star/text/XTextSection.hpp>
#include <tools/ref.hxx>
#include <svl/hint.hxx>
#include <svl/listener.hxx>
#include <sfx2/lnkbase.hxx>
#include <sfx2/Metadatable.hxx>
#include <unotools/weakref.hxx>
#include "frmfmt.hxx"
#include <vector>
class SwSectionFormat;
class SwDoc;
class SwSection;
class SwSectionNode;
class SwTOXBase;
class SwServerObject;
class SwXTextSection;
typedef std::vector<SwSection*> SwSections;
enum class SectionType { Content,
ToxHeader,
ToxContent,
DdeLink =
static_cast<
int>(sfx2::SvBaseLinkObjectType::ClientDde),
FileLink =
static_cast<
int>(sfx2::SvBaseLinkObjectType::ClientFile)
};
enum class LinkCreateType
{
NONE,
// Do nothing.
Connect,
// Connect created link.
Update
// Connect created link and update it.
};
class SW_DLLPUBLIC SwSectionData
{
private:
SectionType m_eType;
UIName m_sSectionName;
OUString m_sCondition;
///< Hide condition
OUString m_sLinkFileName;
OUString m_sLinkFilePassword;
// Must be changed to Sequence.
css::uno::Sequence <sal_Int8> m_Password;
sal_uInt16 m_nPage;
// loaded meta page count for page anchored flys in master document
/// It seems this flag caches the current final "hidden" state.
bool m_bHiddenFlag : 1;
/// Flags that correspond to attributes in the format:
/// may have different value than format attribute:
/// format attr has value for this section, while flag is
/// effectively ORed with parent sections!
bool m_bProtectFlag : 1;
///< protect flag is no longer inherited
// Edit in readonly sections.
bool m_bEditInReadonlyFlag : 1;
bool m_bHidden : 1;
///< Section is hidden, unless condition evaluates `false'
bool m_bCondHiddenFlag : 1;
///< Hide condition evaluated `true'
bool m_bConnectFlag : 1;
// Connected to server?
public:
SwSectionData(SectionType
const eType, UIName aName);
explicit SwSectionData(SwSection
const&);
SwSectionData(SwSectionData
const&);
SwSectionData &
operator=(SwSectionData
const&);
bool operator==(SwSectionData
const&)
const;
const UIName& GetSectionName()
const {
return m_sSectionName; }
void SetSectionName(UIName
const& rName){ m_sSectionName = rName; }
SectionType GetType()
const {
return m_eType; }
void SetType(SectionType
const eNew) { m_eType = eNew; }
bool IsHidden()
const {
return m_bHidden; }
void SetHidden(
bool const bFlag) { m_bHidden = bFlag; }
bool IsHiddenFlag()
const {
return m_bHiddenFlag; }
SAL_DLLPRIVATE
void
SetHiddenFlag(
bool const bFlag) { m_bHiddenFlag = bFlag; }
bool IsProtectFlag()
const {
return m_bProtectFlag; }
SAL_DLLPRIVATE
void
SetProtectFlag(
bool const bFlag) { m_bProtectFlag = bFlag; }
bool IsEditInReadonlyFlag()
const {
return m_bEditInReadonlyFlag; }
void SetEditInReadonlyFlag(
bool const bFlag)
{ m_bEditInReadonlyFlag = bFlag; }
void SetCondHidden(
bool const bFlag) { m_bCondHiddenFlag = bFlag; }
bool IsCondHidden()
const {
return m_bCondHiddenFlag; }
const OUString& GetCondition()
const {
return m_sCondition; }
void SetCondition(OUString
const& rNew) { m_sCondition = rNew; }
const OUString& GetLinkFileName()
const {
return m_sLinkFileName; }
void SetLinkFileName(OUString
const& rNew)
{
m_sLinkFileName = rNew;
}
const OUString& GetLinkFilePassword()
const {
return m_sLinkFilePassword; }
void SetLinkFilePassword(OUString
const& rS){ m_sLinkFilePassword = rS; }
css::uno::Sequence<sal_Int8>
const& GetPassword()
const
{
return m_Password; }
void SetPassword(css::uno::Sequence<sal_Int8>
const& rNew)
{ m_Password = rNew; }
bool IsLinkType()
const
{
return (SectionType::DdeLink == m_eType) || (SectionType::FileLink == m_eType); }
bool IsConnectFlag()
const {
return m_bConnectFlag; }
void SetConnectFlag(
bool const bFlag){ m_bConnectFlag = bFlag; }
sal_uInt16 GetPageNum()
const {
return m_nPage; }
void SetPageNum(sal_uInt16 nPageNum){ m_nPage = nPageNum; }
void dumpAsXml(xmlTextWriterPtr pWriter)
const;
};
class SW_DLLPUBLIC SwSection
:
public SwClient
,
public SvtListener
// needed for SwClientNotify to be called from SwSectionFormat
{
// In order to correctly maintain the flag when creating/deleting frames.
friend class SwSectionNode;
// The "read CTOR" of SwSectionFrame have to change the Hiddenflag.
friend class SwSectionFrame;
private:
mutable SwSectionData m_Data;
tools::SvRef<SwServerObject> m_RefObj;
// Set if DataServer.
tools::SvRef<sfx2::SvBaseLink> m_RefLink;
SAL_DLLPRIVATE
void ImplSetHiddenFlag(
bool const bHidden,
bool const bCondition);
protected:
virtual void Notify(SfxHint
const& rHint) override;
virtual void SwClientNotify(
const SwModify&,
const SfxHint&) override;
public:
SwSection(SectionType
const eType, UIName
const& rName,
SwSectionFormat & rFormat);
virtual ~SwSection() override;
bool DataEquals(SwSectionData
const& rCmp)
const;
void SetSectionData(SwSectionData
const& rData);
const UIName& GetSectionName()
const {
return m_Data.GetSectionName(); }
void SetSectionName(UIName
const& rName){ m_Data.SetSectionName(rName); }
SectionType GetType()
const {
return m_Data.GetType(); }
void SetType(SectionType
const eType) {
return m_Data.SetType(eType); }
inline SwSectionFormat* GetFormat();
inline SwSectionFormat
const * GetFormat()
const;
// Set hidden/protected -> update the whole tree!
// (Attributes/flags are set/get.)
bool IsHidden()
const {
return m_Data.IsHidden(); }
void SetHidden (
bool const bFlag =
true);
bool IsProtect()
const;
void SetProtect(
bool const bFlag =
true);
bool IsEditInReadonly()
const;
void SetEditInReadonly(
bool const bFlag =
true);
// Get internal flags (state including parents, not what is
// currently set at section!).
bool IsHiddenFlag()
const {
return m_Data.IsHiddenFlag(); }
bool IsProtectFlag()
const {
return m_Data.IsProtectFlag(); }
bool IsEditInReadonlyFlag()
const {
return m_Data.IsEditInReadonlyFlag(); }
void SetCondHidden(
bool const bFlag);
bool IsCondHidden()
const {
return m_Data.IsCondHidden(); }
// Query (also for parents) if this section is to be hidden.
bool CalcHiddenFlag()
const;
inline SwSection* GetParent()
const;
OUString
const & GetCondition()
const {
return m_Data.GetCondition(); }
void SetCondition(OUString
const& rNew) { m_Data.SetCondition(rNew); }
OUString
const & GetLinkFileName()
const;
void SetLinkFileName(OUString
const& rNew);
// Password of linked file (only valid during runtime!)
OUString
const & GetLinkFilePassword()
const
{
return m_Data.GetLinkFilePassword(); }
void SetLinkFilePassword(OUString
const& rS)
{ m_Data.SetLinkFilePassword(rS); }
// Get / set password of this section
css::uno::Sequence<sal_Int8>
const& GetPassword()
const
{
return m_Data.GetPassword(); }
sal_uInt16 GetPageNum()
const
{
return m_Data.GetPageNum(); }
void SetPageNum(sal_uInt16 nPage)
{ m_Data.SetPageNum(nPage); }
// Data server methods.
void SetRefObject( SwServerObject* pObj );
const SwServerObject* GetObject()
const {
return m_RefObj.get(); }
SwServerObject* GetObject() {
return m_RefObj.get(); }
bool IsServer()
const {
return m_RefObj.is(); }
// Methods for linked ranges.
SfxLinkUpdateMode GetUpdateType()
const {
return m_RefLink->GetUpdateMode(); }
void SetUpdateType(SfxLinkUpdateMode nType )
{ m_RefLink->SetUpdateMode(nType); }
bool IsConnected()
const {
return m_RefLink.is(); }
void UpdateNow() { m_RefLink->Update(); }
void Disconnect() { m_RefLink->Disconnect(); }
const ::sfx2::SvBaseLink& GetBaseLink()
const {
return *m_RefLink; }
::sfx2::SvBaseLink& GetBaseLink() {
return *m_RefLink; }
void CreateLink( LinkCreateType eType );
static void MakeChildLinksVisible(
const SwSectionNode& rSectNd );
bool IsLinkType()
const {
return m_Data.IsLinkType(); }
// Flags for UI. Did connection work?
bool IsConnectFlag()
const {
return m_Data.IsConnectFlag(); }
void SetConnectFlag(
bool const bFlag =
true)
{ m_Data.SetConnectFlag(bFlag); }
// Return the TOX base class if the section is a TOX section
const SwTOXBase* GetTOXBase()
const;
void BreakLink();
void dumpAsXml(xmlTextWriterPtr pWriter)
const;
};
// #i117863#
class SwSectionFrameMoveAndDeleteHint final :
public SfxHint
{
public:
SwSectionFrameMoveAndDeleteHint(
const bool bSaveContent )
: SfxHint( SfxHintId::SwSectionFrameMoveAndDelete )
, mbSaveContent( bSaveContent )
{}
bool IsSaveContent()
const
{
return mbSaveContent;
}
private:
const bool mbSaveContent;
};
enum class SectionSort {
Not, Pos };
class SW_DLLPUBLIC SwSectionFormat final
:
public SwFrameFormat
,
public ::sfx2::Metadatable
{
friend class SwDoc;
/** Why does this exist in addition to the m_wXObject in SwFrameFormat?
in case of an index, both a SwXDocumentIndex and a SwXTextSection
register at this SwSectionFormat, so we need to have two refs.
*/
unotools::WeakReference<SwXTextSection> m_wXTextSection;
SAL_DLLPRIVATE
void UpdateParent();
// Parent has been changed.
SwSectionFormat( SwFrameFormat* pDrvdFrame, SwDoc& rDoc );
virtual void SwClientNotify(
const SwModify&,
const SfxHint&) override;
public:
virtual ~SwSectionFormat() override;
// Deletes all Frames in aDepend (Frames are recognized via dynamic_cast).
virtual void DelFrames() override;
// Creates views.
virtual void MakeFrames() override;
// Get information from Format.
virtual bool GetInfo( SwFindNearestNode& )
const override;
virtual bool IsVisible()
const override;
SwSection* GetSection()
const;
inline SwSectionFormat* GetParent()
const;
inline SwSection* GetParentSection()
const;
// All sections that are derived from this one:
// - sorted according to name or position or unsorted
// - all of them or only those that are in the normal Nodes-array.
void GetChildSections( SwSections& rArr,
SectionSort eSort = SectionSort::
Not,
bool bAllSections =
true )
const;
// Query whether section is in Nodes-array or in UndoNodes-array.
bool IsInNodesArr()
const;
SwSectionNode* GetSectionNode();
const SwSectionNode* GetSectionNode()
const
{
return const_cast<SwSectionFormat *>(
this)
->GetSectionNode(); }
// Is section a valid one for global document?
const SwSection* GetGlobalDocSection()
const;
SAL_DLLPRIVATE unotools::WeakReference<SwXTextSection>
const& GetXTextSection()
const
{
return m_wXTextSection; }
SAL_DLLPRIVATE
void SetXTextSection(rtl::Reference<SwXTextSection>
const& xTextSec
tion);
// sfx2::Metadatable
virtual ::sfx2::IXmlIdRegistry& GetRegistry() override;
virtual bool IsInClipboard() const override;
virtual bool IsInUndo() const override;
virtual bool IsInContent() const override;
virtual css::uno::Reference< css::rdf::XMetadatable > MakeUnoObject() override;
virtual bool supportsFullDrawingLayerFillAttributeSet() const override;
void dumpAsXml(xmlTextWriterPtr pWriter) const override;
};
SwSectionFormat* SwSection::GetFormat()
{
return static_cast<SwSectionFormat*>(GetRegisteredIn());
}
SwSectionFormat const * SwSection::GetFormat() const
{
return static_cast<SwSectionFormat const *>(GetRegisteredIn());
}
inline SwSection* SwSection::GetParent() const
{
SwSectionFormat const * pFormat = GetFormat();
SwSection* pRet = nullptr;
if( pFormat )
pRet = pFormat->GetParentSection();
return pRet;
}
inline SwSectionFormat* SwSectionFormat::GetParent() const
{
SwSectionFormat* pRet = nullptr;
if( GetRegisteredIn() )
pRet = const_cast<SwSectionFormat*>(dynamic_cast< const SwSectionFormat* >( GetRegisteredIn() ));
return pRet;
}
inline SwSection* SwSectionFormat::GetParentSection() const
{
SwSectionFormat* pParent = GetParent();
SwSection* pRet = nullptr;
if( pParent )
{
pRet = pParent->GetSection();
}
return pRet;
}
#endif /* _ INCLUDED_SW_INC_SECTION_HXX */
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */