diff options
Diffstat (limited to 'sw/source/core/txtnode/txtatr2.cxx')
-rw-r--r-- | sw/source/core/txtnode/txtatr2.cxx | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/sw/source/core/txtnode/txtatr2.cxx b/sw/source/core/txtnode/txtatr2.cxx new file mode 100644 index 000000000..2b51b45ff --- /dev/null +++ b/sw/source/core/txtnode/txtatr2.cxx @@ -0,0 +1,302 @@ +/* -*- 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 <hintids.hxx> +#include <hints.hxx> +#include <osl/diagnose.h> +#include <txtinet.hxx> +#include <txtatr.hxx> +#include <fchrfmt.hxx> +#include <fmtinfmt.hxx> +#include <charfmt.hxx> +#include <ndtxt.hxx> +#include <poolfmt.hxx> +#include <doc.hxx> +#include <fmtruby.hxx> +#include <fmtmeta.hxx> +#include <IDocumentState.hxx> +#include <IDocumentStylePoolAccess.hxx> + + +SwTextCharFormat::SwTextCharFormat( SwFormatCharFormat& rAttr, + sal_Int32 nStt, sal_Int32 nEnd ) + : SwTextAttr( rAttr, nStt ) + , SwTextAttrEnd( rAttr, nStt, nEnd ) + , m_pTextNode( nullptr ) + , m_nSortNumber( 0 ) +{ + rAttr.m_pTextAttribute = this; + SetCharFormatAttr( true ); +} + +SwTextCharFormat::~SwTextCharFormat( ) +{ +} + +void SwTextCharFormat::TriggerNodeUpdate(const sw::LegacyModifyHint& rHint) +{ + const auto nWhich = rHint.GetWhich(); + SAL_WARN_IF( + !isCHRATR(nWhich) && + RES_OBJECTDYING != nWhich && + RES_ATTRSET_CHG != nWhich && + RES_FMT_CHG != nWhich, "sw.core", "SwTextCharFormat::TriggerNodeUpdate: unknown hint type"); + + if(m_pTextNode) + { + SwUpdateAttr aUpdateAttr( + GetStart(), + *GetEnd(), + nWhich); + m_pTextNode->TriggerNodeUpdate(sw::LegacyModifyHint(&aUpdateAttr, &aUpdateAttr)); + } +} + +bool SwTextCharFormat::GetInfo( SfxPoolItem const & rInfo ) const +{ + return RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode || + &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode const &>(rInfo).pNodes; +} + +SwTextAttrNesting::SwTextAttrNesting( SfxPoolItem & i_rAttr, + const sal_Int32 i_nStart, const sal_Int32 i_nEnd ) + : SwTextAttr( i_rAttr, i_nStart ) + , SwTextAttrEnd( i_rAttr, i_nStart, i_nEnd ) +{ + SetDontExpand( true ); // never expand this attribute + // lock the expand flag: simple guarantee that nesting will not be + // invalidated by expand operations + SetLockExpandFlag( true ); + SetDontExpandStartAttr( true ); + SetNesting( true ); +} + +SwTextAttrNesting::~SwTextAttrNesting() +{ +} + +SwTextINetFormat::SwTextINetFormat( SwFormatINetFormat& rAttr, + sal_Int32 nStart, sal_Int32 nEnd ) + : SwTextAttr( rAttr, nStart ) + , SwTextAttrNesting( rAttr, nStart, nEnd ) + , SwClient( nullptr ) + , m_pTextNode( nullptr ) + , m_bVisited( false ) + , m_bVisitedValid( false ) +{ + rAttr.mpTextAttr = this; + SetCharFormatAttr( true ); +} + +SwTextINetFormat::~SwTextINetFormat( ) +{ +} + +SwCharFormat* SwTextINetFormat::GetCharFormat() +{ + const SwFormatINetFormat& rFormat = SwTextAttrEnd::GetINetFormat(); + SwCharFormat* pRet = nullptr; + + if (!rFormat.GetValue().isEmpty()) + { + SwDoc& rDoc = GetTextNode().GetDoc(); + if( !IsVisitedValid() ) + { + SetVisited( rDoc.IsVisitedURL( rFormat.GetValue() ) ); + SetVisitedValid( true ); + } + + const sal_uInt16 nId = IsVisited() ? rFormat.GetVisitedFormatId() : rFormat.GetINetFormatId(); + const OUString& rStr = IsVisited() ? rFormat.GetVisitedFormat() : rFormat.GetINetFormat(); + if (rStr.isEmpty()) + { + OSL_ENSURE( false, "<SwTextINetFormat::GetCharFormat()> - missing character format at hyperlink attribute"); + } + + // JP 10.02.2000, Bug 72806: don't modify the doc for getting the + // correct charstyle. + bool bModifiedEnabled = rDoc.getIDocumentState().IsEnableSetModified(); + rDoc.getIDocumentState().SetEnableSetModified(false); + + pRet = IsPoolUserFormat( nId ) + ? rDoc.FindCharFormatByName( rStr ) + : rDoc.getIDocumentStylePoolAccess().GetCharFormatFromPool( nId ); + + rDoc.getIDocumentState().SetEnableSetModified(bModifiedEnabled); + } + + if ( pRet ) + pRet->Add( this ); + else + EndListeningAll(); + + return pRet; +} + +void SwTextINetFormat::SwClientNotify(const SwModify&, const SfxHint& rHint) +{ + if (rHint.GetId() != SfxHintId::SwLegacyModify) + return; + auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint); + const auto nWhich = pLegacy->GetWhich(); + OSL_ENSURE(isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich) + || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich), + "SwTextINetFormat::SwClientNotify: unknown hint."); + if(!m_pTextNode) + return; + + const SwUpdateAttr aUpdateAttr(GetStart(), *GetEnd(), nWhich); + m_pTextNode->TriggerNodeUpdate(sw::LegacyModifyHint(&aUpdateAttr, &aUpdateAttr)); +} + +bool SwTextINetFormat::GetInfo( SfxPoolItem& rInfo ) const +{ + return RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode || + &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes; +} + +bool SwTextINetFormat::IsProtect( ) const +{ + return m_pTextNode && m_pTextNode->IsProtect(); +} + +SwTextRuby::SwTextRuby( SwFormatRuby& rAttr, + sal_Int32 nStart, sal_Int32 nEnd ) + : SwTextAttr( rAttr, nStart ) + , SwTextAttrNesting( rAttr, nStart, nEnd ) + , SwClient( nullptr ) + , m_pTextNode( nullptr ) +{ + rAttr.m_pTextAttr = this; +} + +SwTextRuby::~SwTextRuby() +{ +} + +void SwTextRuby::SwClientNotify(const SwModify&, const SfxHint& rHint) +{ + if (rHint.GetId() != SfxHintId::SwLegacyModify) + return; + auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint); + const auto nWhich = pLegacy->GetWhich(); + SAL_WARN_IF( !isCHRATR(nWhich) + && (RES_OBJECTDYING == nWhich) + && (RES_ATTRSET_CHG == nWhich) + && (RES_FMT_CHG == nWhich), "sw.core", "SwTextRuby::SwClientNotify(): unknown legacy hint"); + if(!m_pTextNode) + return; + SwUpdateAttr aUpdateAttr(GetStart(), *GetEnd(), nWhich); + m_pTextNode->TriggerNodeUpdate(sw::LegacyModifyHint(&aUpdateAttr, &aUpdateAttr)); +} + +bool SwTextRuby::GetInfo( SfxPoolItem& rInfo ) const +{ + return RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode || + &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes; +} + +SwCharFormat* SwTextRuby::GetCharFormat() +{ + const SwFormatRuby& rFormat = SwTextAttrEnd::GetRuby(); + SwCharFormat* pRet = nullptr; + + if( !rFormat.GetText().isEmpty() ) + { + const SwDoc& rDoc = GetTextNode().GetDoc(); + const OUString& rStr = rFormat.GetCharFormatName(); + const sal_uInt16 nId = rStr.isEmpty() + ? o3tl::narrowing<sal_uInt16>(RES_POOLCHR_RUBYTEXT) + : rFormat.GetCharFormatId(); + + // JP 10.02.2000, Bug 72806: don't modify the doc for getting the + // correct charstyle. + const bool bResetMod = !rDoc.getIDocumentState().IsModified(); + Link<bool,void> aOle2Lnk; + if( bResetMod ) + { + aOle2Lnk = rDoc.GetOle2Link(); + const_cast<SwDoc&>(rDoc).SetOle2Link( Link<bool,void>() ); + } + + pRet = IsPoolUserFormat( nId ) + ? rDoc.FindCharFormatByName( rStr ) + : const_cast<SwDoc&>(rDoc).getIDocumentStylePoolAccess().GetCharFormatFromPool( nId ); + + if( bResetMod ) + { + const_cast<SwDoc&>(rDoc).getIDocumentState().ResetModified(); + const_cast<SwDoc&>(rDoc).SetOle2Link( aOle2Lnk ); + } + } + + if( pRet ) + pRet->Add( this ); + else + EndListeningAll(); + + return pRet; +} + +SwTextMeta * +SwTextMeta::CreateTextMeta( + ::sw::MetaFieldManager & i_rTargetDocManager, + SwTextNode *const i_pTargetTextNode, + SwFormatMeta & i_rAttr, + sal_Int32 const i_nStart, + sal_Int32 const i_nEnd, + bool const i_bIsCopy) +{ + if (i_bIsCopy) + { // i_rAttr is already cloned, now call DoCopy to copy the sw::Meta + OSL_ENSURE(i_pTargetTextNode, "cannot copy Meta without target node"); + i_rAttr.DoCopy(i_rTargetDocManager, *i_pTargetTextNode); + } + SwTextMeta *const pTextMeta(new SwTextMeta(i_rAttr, i_nStart, i_nEnd)); + return pTextMeta; +} + +SwTextMeta::SwTextMeta( SwFormatMeta & i_rAttr, + const sal_Int32 i_nStart, const sal_Int32 i_nEnd ) + : SwTextAttr( i_rAttr, i_nStart ) + , SwTextAttrNesting( i_rAttr, i_nStart, i_nEnd ) +{ + i_rAttr.SetTextAttr( this ); + SetHasDummyChar(true); +} + +SwTextMeta::~SwTextMeta() +{ + SwFormatMeta & rFormatMeta( static_cast<SwFormatMeta &>(GetAttr()) ); + if (rFormatMeta.GetTextAttr() == this) + { + rFormatMeta.SetTextAttr(nullptr); + } +} + +void SwTextMeta::ChgTextNode(SwTextNode * const pNode) +{ + SwFormatMeta & rFormatMeta( static_cast<SwFormatMeta &>(GetAttr()) ); + if (rFormatMeta.GetTextAttr() == this) + { + rFormatMeta.NotifyChangeTextNode(pNode); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |