blob: 71f2c6dac943cca73b7bab0d0e1fb835b586b189 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SECTION_HXX
#define _SECTION_HXX
#include <boost/utility.hpp>
#include <com/sun/star/uno/Sequence.h>
#include <tools/rtti.hxx>
#include <tools/ref.hxx>
#include <svl/svarray.hxx>
// --> OD #i117863#
#include <svl/smplhint.hxx>
// <--
#include <sfx2/lnkbase.hxx>
#include <sfx2/Metadatable.hxx>
#include <frmfmt.hxx>
namespace com { namespace sun { namespace star {
namespace text { class XTextSection; }
} } }
// Forward Deklaration
class SwSectionFmt;
class SwDoc;
class SwSection;
class SwSectionNode;
class SwTOXBase;
#ifndef SW_DECL_SWSERVEROBJECT_DEFINED
#define SW_DECL_SWSERVEROBJECT_DEFINED
SV_DECL_REF( SwServerObject )
#endif
SV_DECL_PTRARR( SwSections, SwSection*, 0, 4 )
enum SectionType { CONTENT_SECTION,
TOX_HEADER_SECTION,
TOX_CONTENT_SECTION,
DDE_LINK_SECTION = OBJECT_CLIENT_DDE,
FILE_LINK_SECTION = OBJECT_CLIENT_FILE
/*
// verbleiben noch:
OBJECT_CLIENT_SO = 0x80,
OBJECT_CLIENT_OLE = 0x82,
OBJECT_CLIENT_OLE_CACHE = 0x83,
*/
};
enum LinkCreateType
{
CREATE_NONE, // nichts weiter tun
CREATE_CONNECT, // Link gleich connecten
CREATE_UPDATE // Link connecten und updaten
};
class SW_DLLPUBLIC SwSectionData
{
private:
SectionType m_eType;
String m_sSectionName;
String m_sCondition;
String m_sLinkFileName;
String m_sLinkFilePassword; // JP 27.02.2001: must be changed to Sequence
::com::sun::star::uno::Sequence <sal_Int8> m_Password;
/// 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;
// --> FME 2004-06-22 #114856# edit in readonly sections
bool m_bEditInReadonlyFlag : 1;
// <--
bool m_bHidden : 1; // all paragraphs hidden?
bool m_bCondHiddenFlag : 1; // Hiddenflag for condition
bool m_bConnectFlag : 1; // connected to server?
public:
SwSectionData(SectionType const eType, String const& rName);
explicit SwSectionData(SwSection const&);
SwSectionData(SwSectionData const&);
SwSectionData & operator=(SwSectionData const&);
bool operator==(SwSectionData const&) const;
String const& GetSectionName() const { return m_sSectionName; }
void SetSectionName(String 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 = true) { m_bHidden = bFlag; }
bool IsHiddenFlag() const { return m_bHiddenFlag; }
SW_DLLPRIVATE void
SetHiddenFlag(bool const bFlag) { m_bHiddenFlag = bFlag; }
bool IsProtectFlag() const { return m_bProtectFlag; }
SW_DLLPRIVATE void
SetProtectFlag(bool const bFlag) { m_bProtectFlag = bFlag; }
// --> FME 2004-06-22 #114856# edit in readonly sections
bool IsEditInReadonlyFlag() const { return m_bEditInReadonlyFlag; }
void SetEditInReadonlyFlag(bool const bFlag)
{ m_bEditInReadonlyFlag = bFlag; }
// <--
void SetCondHidden(bool const bFlag = true) { m_bCondHiddenFlag = bFlag; };
bool IsCondHidden() const { return m_bCondHiddenFlag; }
String const& GetCondition() const { return m_sCondition; }
void SetCondition(String const& rNew) { m_sCondition = rNew; }
String const& GetLinkFileName() const { return m_sLinkFileName; };
void SetLinkFileName(String const& rNew, String const* pPassWd = 0)
{
m_sLinkFileName = rNew;
if (pPassWd) { SetLinkFilePassword(*pPassWd); }
}
String const& GetLinkFilePassword() const { return m_sLinkFilePassword; }
void SetLinkFilePassword(String const& rS) { m_sLinkFilePassword = rS; }
::com::sun::star::uno::Sequence<sal_Int8> const& GetPassword() const
{ return m_Password; }
void SetPassword(::com::sun::star::uno::Sequence<sal_Int8> const& rNew)
{ m_Password = rNew; }
bool IsLinkType() const
{ return (DDE_LINK_SECTION == m_eType) || (FILE_LINK_SECTION == m_eType); }
bool IsConnectFlag() const { return m_bConnectFlag; }
void SetConnectFlag(bool const bFlag = true){ m_bConnectFlag = bFlag; }
};
class SW_DLLPUBLIC SwSection
: public SwClient
{
// damit beim Anlegen/Loeschen von Frames das Flag richtig gepflegt wird!
friend class SwSectionNode;
// the "read CTOR" of SwSectionFrm have to change the Hiddenflag
friend class SwSectionFrm;
private:
SwSectionData m_Data;
SwServerObjectRef m_RefObj; // set if DataServer
::sfx2::SvBaseLinkRef m_RefLink;
SW_DLLPRIVATE void ImplSetHiddenFlag(
bool const bHidden, bool const bCondition);
protected:
virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew );
public:
TYPEINFO(); // rtti
SwSection(SectionType const eType, String const& rName,
SwSectionFmt & rFormat);
virtual ~SwSection();
bool DataEquals(SwSectionData const& rCmp) const;
void SetSectionData(SwSectionData const& rData);
String const& GetSectionName() const { return m_Data.GetSectionName(); }
void SetSectionName(String const& rName){ m_Data.SetSectionName(rName); }
SectionType GetType() const { return m_Data.GetType(); }
void SetType(SectionType const eType) { return m_Data.SetType(eType); }
SwSectionFmt* GetFmt() { return (SwSectionFmt*)GetRegisteredIn(); }
SwSectionFmt* GetFmt() const { return (SwSectionFmt*)GetRegisteredIn(); }
// setze die Hidden/Protected -> gesamten Baum updaten !
// (Attribute/Flags werden gesetzt/erfragt)
bool IsHidden() const { return m_Data.IsHidden(); }
void SetHidden (bool const bFlag = true);
bool IsProtect() const;
void SetProtect(bool const bFlag = true);
// --> FME 2004-06-22 #114856# edit in readonly sections
bool IsEditInReadonly() const;
void SetEditInReadonly(bool const bFlag = true);
// <--
// erfrage die internen Flags (Zustand inklusive Parents nicht, was
// aktuell an der Section gesetzt ist!!)
bool IsHiddenFlag() const { return m_Data.IsHiddenFlag(); }
bool IsProtectFlag() const { return m_Data.IsProtectFlag(); }
// --> FME 2004-06-22 #114856# edit in readonly sections
bool IsEditInReadonlyFlag() const { return m_Data.IsEditInReadonlyFlag(); }
// <--
void SetCondHidden(bool const bFlag = true);
bool IsCondHidden() const { return m_Data.IsCondHidden(); }
// erfrage (auch ueber die Parents), ob diese Section versteckt sein soll.
sal_Bool CalcHiddenFlag() const;
inline SwSection* GetParent() const;
String const& GetCondition() const { return m_Data.GetCondition(); }
void SetCondition(String const& rNew) { m_Data.SetCondition(rNew); }
const String& GetLinkFileName() const;
void SetLinkFileName(String const& rNew, String const*const pPassWd = 0);
// password of linked file (only valid during runtime!)
String const& GetLinkFilePassword() const
{ return m_Data.GetLinkFilePassword(); }
void SetLinkFilePassword(String const& rS)
{ m_Data.SetLinkFilePassword(rS); }
// get / set password of this section
::com::sun::star::uno::Sequence<sal_Int8> const& GetPassword() const
{ return m_Data.GetPassword(); }
void SetPassword(::com::sun::star::uno::Sequence <sal_Int8> const& rNew)
{ m_Data.SetPassword(rNew); }
// Daten Server-Methoden
void SetRefObject( SwServerObject* pObj );
const SwServerObject* GetObject() const { return & m_RefObj; }
SwServerObject* GetObject() { return & m_RefObj; }
bool IsServer() const { return m_RefObj.Is(); }
// Methoden fuer gelinkte Bereiche
sal_uInt16 GetUpdateType() const { return m_RefLink->GetUpdateMode(); }
void SetUpdateType(sal_uInt16 const 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 );
void MakeChildLinksVisible( const SwSectionNode& rSectNd );
bool IsLinkType() const { return m_Data.IsLinkType(); }
// Flags fuer UI - Verbindung geklappt?
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;
// --> OD 2007-02-14 #b6521322#
void BreakLink();
// <--
};
// --> OD #i117863#
class SwSectionFrmMoveAndDeleteHint : public SfxSimpleHint
{
public:
SwSectionFrmMoveAndDeleteHint( const sal_Bool bSaveCntnt )
: SfxSimpleHint( SFX_HINT_DYING )
, mbSaveCntnt( bSaveCntnt )
{}
~SwSectionFrmMoveAndDeleteHint()
{}
sal_Bool IsSaveCntnt() const
{
return mbSaveCntnt;
}
private:
const sal_Bool mbSaveCntnt;
};
// <--
enum SectionSort { SORTSECT_NOT, SORTSECT_NAME, SORTSECT_POS };
class SW_DLLPUBLIC SwSectionFmt
: public SwFrmFmt
, public ::sfx2::Metadatable
{
friend class SwDoc;
/** why does this exist in addition to the m_wXObject in SwFrmFmt?
in case of an index, both a SwXDocumentIndex and a SwXTextSection
register at this SwSectionFmt, so we need to have two refs.
*/
::com::sun::star::uno::WeakReference<
::com::sun::star::text::XTextSection> m_wXTextSection;
SW_DLLPRIVATE void UpdateParent(); // Parent wurde veraendert
protected:
SwSectionFmt( SwSectionFmt* pDrvdFrm, SwDoc *pDoc );
virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew );
public:
TYPEINFO(); //Bereits in Basisklasse Client drin.
~SwSectionFmt();
//Vernichtet alle Frms in aDepend (Frms werden per PTR_CAST erkannt).
virtual void DelFrms();
//Erzeugt die Ansichten
virtual void MakeFrms();
// erfrage vom Format Informationen
virtual sal_Bool GetInfo( SfxPoolItem& ) const;
SwSection* GetSection() const;
inline SwSectionFmt* GetParent() const;
inline SwSection* GetParentSection() const;
// alle Sections, die von dieser abgeleitet sind
// - sortiert nach : Name oder Position oder unsortiert
// - alle oder nur die, die sich im normalten Nodes-Array befinden
sal_uInt16 GetChildSections( SwSections& rArr,
SectionSort eSort = SORTSECT_NOT,
sal_Bool bAllSections = sal_True ) const;
// erfrage, ob sich die Section im Nodes-Array oder UndoNodes-Array
// befindet.
sal_Bool IsInNodesArr() const;
SwSectionNode* GetSectionNode(bool const bEvenIfInUndo = false);
const SwSectionNode* GetSectionNode(bool const bEvenIfInUndo = false) const
{ return const_cast<SwSectionFmt *>(this)
->GetSectionNode(bEvenIfInUndo); }
// ist die Section eine gueltige fuers GlobalDocument?
const SwSection* GetGlobalDocSection() const;
SW_DLLPRIVATE ::com::sun::star::uno::WeakReference<
::com::sun::star::text::XTextSection> const& GetXTextSection() const
{ return m_wXTextSection; }
SW_DLLPRIVATE void SetXTextSection(::com::sun::star::uno::Reference<
::com::sun::star::text::XTextSection> const& xTextSection)
{ m_wXTextSection = xTextSection; }
// sfx2::Metadatable
virtual ::sfx2::IXmlIdRegistry& GetRegistry();
virtual bool IsInClipboard() const;
virtual bool IsInUndo() const;
virtual bool IsInContent() const;
virtual ::com::sun::star::uno::Reference<
::com::sun::star::rdf::XMetadatable > MakeUnoObject();
};
// -------------- inlines ---------------------------------
inline SwSection* SwSection::GetParent() const
{
SwSectionFmt* pFmt = GetFmt();
SwSection* pRet = 0;
if( pFmt )
pRet = pFmt->GetParentSection();
return pRet;
}
inline SwSectionFmt* SwSectionFmt::GetParent() const
{
SwSectionFmt* pRet = 0;
if( GetRegisteredIn() )
pRet = PTR_CAST( SwSectionFmt, GetRegisteredIn() );
return pRet;
}
inline SwSection* SwSectionFmt::GetParentSection() const
{
SwSectionFmt* pParent = GetParent();
SwSection* pRet = 0;
if( pParent )
{
pRet = pParent->GetSection();
}
return pRet;
}
#endif /* _SECTION_HXX */