summaryrefslogtreecommitdiffstats
path: root/sw/inc/txatbase.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/inc/txatbase.hxx')
-rw-r--r--sw/inc/txatbase.hxx268
1 files changed, 268 insertions, 0 deletions
diff --git a/sw/inc/txatbase.hxx b/sw/inc/txatbase.hxx
new file mode 100644
index 000000000..183e254f8
--- /dev/null
+++ b/sw/inc/txatbase.hxx
@@ -0,0 +1,268 @@
+/* -*- 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_TXATBASE_HXX
+#define INCLUDED_SW_INC_TXATBASE_HXX
+
+#include <svl/poolitem.hxx>
+#include "hintids.hxx"
+#include "fmtautofmt.hxx"
+#include "fmtinfmt.hxx"
+#include "fmtrfmrk.hxx"
+#include "fmtruby.hxx"
+#include "fmtfld.hxx"
+#include "fmtflcnt.hxx"
+#include "fmtftn.hxx"
+#include "formatlinebreak.hxx"
+#include "formatcontentcontrol.hxx"
+#include "fchrfmt.hxx"
+#include "tox.hxx"
+#include "ndhints.hxx"
+
+class SfxItemPool;
+
+/**
+ * A wrapper around SfxPoolItem to store the start position of (usually) a text portion, with an
+ * optional end.
+ */
+class SW_DLLPUBLIC SwTextAttr
+{
+friend class SwpHints;
+private:
+ SfxPoolItem * const m_pAttr;
+ sal_Int32 m_nStart;
+ bool m_bDontExpand : 1;
+ bool m_bLockExpandFlag : 1;
+
+ bool m_bDontMoveAttr : 1; // refmarks, toxmarks
+ bool m_bCharFormatAttr : 1; // charfmt, inet
+ bool m_bOverlapAllowedAttr : 1; // refmarks, toxmarks
+ bool m_bPriorityAttr : 1; // attribute has priority (redlining)
+ bool m_bDontExpandStart : 1; // don't expand start at paragraph start (ruby)
+ bool m_bNesting : 1; // SwTextAttrNesting
+ bool m_bHasDummyChar : 1; // without end + meta
+ bool m_bFormatIgnoreStart : 1; ///< text formatting should ignore start
+ bool m_bFormatIgnoreEnd : 1; ///< text formatting should ignore end
+ bool m_bHasContent : 1; // text attribute with content
+
+ SwTextAttr(SwTextAttr const&) = delete;
+ SwTextAttr& operator=(SwTextAttr const&) = delete;
+
+protected:
+ SwpHints * m_pHints = nullptr; // the SwpHints holds a pointer to this, and needs to be notified if the start/end changes
+
+ SwTextAttr( SfxPoolItem& rAttr, sal_Int32 nStart );
+ virtual ~SwTextAttr() COVERITY_NOEXCEPT_FALSE;
+
+ void SetLockExpandFlag( bool bFlag ) { m_bLockExpandFlag = bFlag; }
+ void SetDontMoveAttr( bool bFlag ) { m_bDontMoveAttr = bFlag; }
+ void SetCharFormatAttr( bool bFlag ) { m_bCharFormatAttr = bFlag; }
+ void SetOverlapAllowedAttr( bool bFlag ){ m_bOverlapAllowedAttr = bFlag; }
+ void SetDontExpandStartAttr(bool bFlag) { m_bDontExpandStart = bFlag; }
+ void SetNesting(const bool bFlag) { m_bNesting = bFlag; }
+ void SetHasDummyChar(const bool bFlag) { m_bHasDummyChar = bFlag; }
+ void SetHasContent( const bool bFlag ) { m_bHasContent = bFlag; }
+
+public:
+
+ /// destroy instance
+ static void Destroy( SwTextAttr * pToDestroy, SfxItemPool& rPool );
+
+ /// start position
+ void SetStart(sal_Int32 n) { m_nStart = n; if (m_pHints) m_pHints->StartPosChanged(); }
+ sal_Int32 GetStart() const { return m_nStart; }
+
+ /// end position
+ virtual const sal_Int32* GetEnd() const;
+ virtual void SetEnd(sal_Int32);
+ inline const sal_Int32* End() const;
+ /// end (if available), else start
+ inline sal_Int32 GetAnyEnd() const;
+
+ inline void SetDontExpand( bool bDontExpand );
+ bool DontExpand() const { return m_bDontExpand; }
+ bool IsLockExpandFlag() const { return m_bLockExpandFlag; }
+ bool IsDontMoveAttr() const { return m_bDontMoveAttr; }
+ bool IsCharFormatAttr() const { return m_bCharFormatAttr; }
+ bool IsOverlapAllowedAttr() const { return m_bOverlapAllowedAttr; }
+ bool IsPriorityAttr() const { return m_bPriorityAttr; }
+ void SetPriorityAttr( bool bFlag ) { m_bPriorityAttr = bFlag; }
+ bool IsDontExpandStartAttr() const { return m_bDontExpandStart; }
+ bool IsNesting() const { return m_bNesting; }
+ bool HasDummyChar() const { return m_bHasDummyChar; }
+ bool IsFormatIgnoreStart() const { return m_bFormatIgnoreStart; }
+ bool IsFormatIgnoreEnd () const { return m_bFormatIgnoreEnd ; }
+ void SetFormatIgnoreStart(bool bFlag) { m_bFormatIgnoreStart = bFlag; }
+ void SetFormatIgnoreEnd (bool bFlag) { m_bFormatIgnoreEnd = bFlag; }
+ bool HasContent() const { return m_bHasContent; }
+
+ inline const SfxPoolItem& GetAttr() const;
+ inline SfxPoolItem& GetAttr();
+ sal_uInt16 Which() const { return GetAttr().Which(); }
+
+ bool operator==( const SwTextAttr& ) const;
+
+ inline const SwFormatCharFormat &GetCharFormat() const;
+ inline const SwFormatAutoFormat &GetAutoFormat() const;
+ inline const SwFormatField &GetFormatField() const;
+ inline const SwFormatFootnote &GetFootnote() const;
+ inline const SwFormatLineBreak& GetLineBreak() const;
+ inline const SwFormatContentControl& GetContentControl() const;
+ inline const SwFormatFlyCnt &GetFlyCnt() const;
+ inline const SwTOXMark &GetTOXMark() const;
+ inline const SwFormatRefMark &GetRefMark() const;
+ inline const SwFormatINetFormat &GetINetFormat() const;
+ inline const SwFormatRuby &GetRuby() const;
+
+ virtual void dumpAsXml(xmlTextWriterPtr pWriter) const;
+};
+
+class SAL_DLLPUBLIC_RTTI SwTextAttrEnd : public virtual SwTextAttr
+{
+protected:
+ sal_Int32 m_nEnd;
+
+public:
+ SwTextAttrEnd( SfxPoolItem& rAttr, sal_Int32 nStart, sal_Int32 nEnd );
+
+ virtual const sal_Int32* GetEnd() const override;
+ virtual void SetEnd(sal_Int32) override;
+};
+
+// attribute that must not overlap others
+class SAL_DLLPUBLIC_RTTI SwTextAttrNesting : public SwTextAttrEnd
+{
+protected:
+ SwTextAttrNesting( SfxPoolItem & i_rAttr,
+ const sal_Int32 i_nStart, const sal_Int32 i_nEnd );
+ virtual ~SwTextAttrNesting() override;
+};
+
+inline const sal_Int32* SwTextAttr::End() const
+{
+ return GetEnd();
+}
+
+inline sal_Int32 SwTextAttr::GetAnyEnd() const
+{
+ const sal_Int32* pEnd = End();
+ return pEnd ? *pEnd : m_nStart;
+}
+
+inline const SfxPoolItem& SwTextAttr::GetAttr() const
+{
+ assert( m_pAttr );
+ return *m_pAttr;
+}
+
+inline SfxPoolItem& SwTextAttr::GetAttr()
+{
+ return const_cast<SfxPoolItem&>(
+ const_cast<const SwTextAttr*>(this)->GetAttr());
+}
+
+inline void SwTextAttr::SetDontExpand( bool bDontExpand )
+{
+ if ( !m_bLockExpandFlag )
+ {
+ m_bDontExpand = bDontExpand;
+ }
+}
+
+inline const SwFormatCharFormat& SwTextAttr::GetCharFormat() const
+{
+ assert( m_pAttr && m_pAttr->Which() == RES_TXTATR_CHARFMT );
+ return static_cast<const SwFormatCharFormat&>(*m_pAttr);
+}
+
+inline const SwFormatAutoFormat& SwTextAttr::GetAutoFormat() const
+{
+ assert( m_pAttr && m_pAttr->Which() == RES_TXTATR_AUTOFMT );
+ return static_cast<const SwFormatAutoFormat&>(*m_pAttr);
+}
+
+inline const SwFormatField& SwTextAttr::GetFormatField() const
+{
+ assert( m_pAttr
+ && ( m_pAttr->Which() == RES_TXTATR_FIELD
+ || m_pAttr->Which() == RES_TXTATR_ANNOTATION
+ || m_pAttr->Which() == RES_TXTATR_INPUTFIELD ));
+ return static_cast<const SwFormatField&>(*m_pAttr);
+}
+
+inline const SwFormatFootnote& SwTextAttr::GetFootnote() const
+{
+ assert( m_pAttr && m_pAttr->Which() == RES_TXTATR_FTN );
+ return static_cast<const SwFormatFootnote&>(*m_pAttr);
+}
+
+inline const SwFormatLineBreak& SwTextAttr::GetLineBreak() const
+{
+ assert(m_pAttr && m_pAttr->Which() == RES_TXTATR_LINEBREAK);
+ return static_cast<const SwFormatLineBreak&>(*m_pAttr);
+}
+
+inline const SwFormatContentControl& SwTextAttr::GetContentControl() const
+{
+ assert(m_pAttr && m_pAttr->Which() == RES_TXTATR_CONTENTCONTROL);
+ return static_cast<const SwFormatContentControl&>(*m_pAttr);
+}
+
+inline const SwFormatFlyCnt& SwTextAttr::GetFlyCnt() const
+{
+ assert( m_pAttr && m_pAttr->Which() == RES_TXTATR_FLYCNT );
+ return static_cast<const SwFormatFlyCnt&>(*m_pAttr);
+}
+
+inline const SwTOXMark& SwTextAttr::GetTOXMark() const
+{
+ assert( m_pAttr && m_pAttr->Which() == RES_TXTATR_TOXMARK );
+ return static_cast<const SwTOXMark&>(*m_pAttr);
+}
+
+inline const SwFormatRefMark& SwTextAttr::GetRefMark() const
+{
+ assert( m_pAttr && m_pAttr->Which() == RES_TXTATR_REFMARK );
+ return static_cast<const SwFormatRefMark&>(*m_pAttr);
+}
+
+inline const SwFormatINetFormat& SwTextAttr::GetINetFormat() const
+{
+ assert( m_pAttr && m_pAttr->Which() == RES_TXTATR_INETFMT );
+ return static_cast<const SwFormatINetFormat&>(*m_pAttr);
+}
+
+inline const SwFormatRuby& SwTextAttr::GetRuby() const
+{
+ assert( m_pAttr && m_pAttr->Which() == RES_TXTATR_CJK_RUBY );
+ return static_cast<const SwFormatRuby&>(*m_pAttr);
+}
+
+// these should be static_casts but with virtual inheritance it's not possible
+template<typename T, typename S> inline T static_txtattr_cast(S * s)
+{
+ return dynamic_cast<T>(s);
+}
+template<typename T, typename S> inline T static_txtattr_cast(S & s)
+{
+ return dynamic_cast<T>(s);
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */