summaryrefslogtreecommitdiff
path: root/sw/source/core/txtnode/txtatr2.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/txtnode/txtatr2.cxx')
-rw-r--r--sw/source/core/txtnode/txtatr2.cxx353
1 files changed, 353 insertions, 0 deletions
diff --git a/sw/source/core/txtnode/txtatr2.cxx b/sw/source/core/txtnode/txtatr2.cxx
new file mode 100644
index 000000000000..5db0ab4b6f4a
--- /dev/null
+++ b/sw/source/core/txtnode/txtatr2.cxx
@@ -0,0 +1,353 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+#include <hintids.hxx>
+#include <hints.hxx>
+#include <sfx2/objsh.hxx>
+#include <editeng/xmlcnitm.hxx>
+#include <editeng/twolinesitem.hxx>
+#include <txtinet.hxx>
+#include <txtatr.hxx>
+#include <fchrfmt.hxx>
+#include <fmtinfmt.hxx>
+#include <charfmt.hxx>
+#include <ndtxt.hxx> // SwCharFmt, SwTxtNode
+#include <poolfmt.hxx> // RES_POOLCHR_INET_...
+#include <doc.hxx> // SwDoc
+#include <fmtruby.hxx>
+#include <fmtmeta.hxx>
+
+
+TYPEINIT1(SwTxtINetFmt,SwClient);
+TYPEINIT1(SwTxtRuby,SwClient);
+
+
+/*************************************************************************
+ * class SwTxtCharFmt
+ *************************************************************************/
+
+SwTxtCharFmt::SwTxtCharFmt( SwFmtCharFmt& rAttr,
+ xub_StrLen nStt, xub_StrLen nEnde )
+ : SwTxtAttrEnd( rAttr, nStt, nEnde )
+ , m_pTxtNode( 0 )
+ , m_nSortNumber( 0 )
+{
+ rAttr.pTxtAttr = this;
+ SetCharFmtAttr( sal_True );
+}
+
+SwTxtCharFmt::~SwTxtCharFmt( )
+{
+}
+
+void SwTxtCharFmt::ModifyNotification( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
+{
+ sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
+ OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
+ || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
+ "SwTxtCharFmt::Modify(): unknown Modify");
+
+ if ( m_pTxtNode )
+ {
+ SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich );
+ m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
+ }
+}
+
+bool SwTxtCharFmt::GetInfo( SfxPoolItem& rInfo ) const
+{
+ if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
+ &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
+ {
+ return true;
+ }
+
+ static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
+ return false;
+}
+
+
+/*************************************************************************
+ * class SwTxtAttrNesting
+ *************************************************************************/
+
+SwTxtAttrNesting::SwTxtAttrNesting( SfxPoolItem & i_rAttr,
+ const xub_StrLen i_nStart, const xub_StrLen i_nEnd )
+ : SwTxtAttrEnd( 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 );
+}
+
+SwTxtAttrNesting::~SwTxtAttrNesting()
+{
+}
+
+
+/*************************************************************************
+ * class SwTxtINetFmt
+ *************************************************************************/
+
+SwTxtINetFmt::SwTxtINetFmt( SwFmtINetFmt& rAttr,
+ xub_StrLen nStart, xub_StrLen nEnd )
+ : SwTxtAttrNesting( rAttr, nStart, nEnd )
+ , SwClient( 0 )
+ , m_pTxtNode( 0 )
+ , m_bVisited( false )
+ , m_bVisitedValid( false )
+{
+ rAttr.pTxtAttr = this;
+ SetCharFmtAttr( true );
+}
+
+SwTxtINetFmt::~SwTxtINetFmt( )
+{
+}
+
+SwCharFmt* SwTxtINetFmt::GetCharFmt()
+{
+ const SwFmtINetFmt& rFmt = SwTxtAttrEnd::GetINetFmt();
+ SwCharFmt* pRet = NULL;
+
+ if( rFmt.GetValue().Len() )
+ {
+ const SwDoc* pDoc = GetTxtNode().GetDoc();
+ if( !IsVisitedValid() )
+ {
+ SetVisited( pDoc->IsVisitedURL( rFmt.GetValue() ) );
+ SetVisitedValid( true );
+ }
+ sal_uInt16 nId;
+ const String& rStr = IsVisited() ? rFmt.GetVisitedFmt()
+ : rFmt.GetINetFmt();
+ if( rStr.Len() )
+ nId = IsVisited() ? rFmt.GetVisitedFmtId() : rFmt.GetINetFmtId();
+ else
+ nId = static_cast<sal_uInt16>(IsVisited() ? RES_POOLCHR_INET_VISIT : RES_POOLCHR_INET_NORMAL);
+
+ // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
+ // correct charstyle.
+ sal_Bool bResetMod = !pDoc->IsModified();
+ Link aOle2Lnk;
+ if( bResetMod )
+ {
+ aOle2Lnk = pDoc->GetOle2Link();
+ ((SwDoc*)pDoc)->SetOle2Link( Link() );
+ }
+
+ pRet = IsPoolUserFmt( nId )
+ ? ((SwDoc*)pDoc)->FindCharFmtByName( rStr )
+ : ((SwDoc*)pDoc)->GetCharFmtFromPool( nId );
+
+ if( bResetMod )
+ {
+ ((SwDoc*)pDoc)->ResetModified();
+ ((SwDoc*)pDoc)->SetOle2Link( aOle2Lnk );
+ }
+ }
+
+ if( pRet )
+ pRet->Add( this );
+ else if( GetRegisteredIn() )
+ GetRegisteredInNonConst()->Remove( this );
+
+ return pRet;
+}
+
+void SwTxtINetFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
+{
+ sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
+ OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
+ || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
+ "SwTxtINetFmt::Modify(): unknown Modify");
+
+ if ( m_pTxtNode )
+ {
+ SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich );
+ m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
+ }
+}
+
+ // erfrage vom Modify Informationen
+sal_Bool SwTxtINetFmt::GetInfo( SfxPoolItem& rInfo ) const
+{
+ if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
+ &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
+ {
+ return sal_True;
+ }
+
+ static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
+ return sal_False;
+}
+
+sal_Bool SwTxtINetFmt::IsProtect( ) const
+{
+ return m_pTxtNode && m_pTxtNode->IsProtect();
+}
+
+/*************************************************************************
+ * class SwTxtRuby
+ *************************************************************************/
+
+SwTxtRuby::SwTxtRuby( SwFmtRuby& rAttr,
+ xub_StrLen nStart, xub_StrLen nEnd )
+ : SwTxtAttrNesting( rAttr, nStart, nEnd )
+ , SwClient( 0 )
+ , m_pTxtNode( 0 )
+{
+ rAttr.pTxtAttr = this;
+}
+
+SwTxtRuby::~SwTxtRuby()
+{
+}
+
+void SwTxtRuby::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
+{
+ sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
+ OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
+ || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
+ "SwTxtRuby::Modify(): unknown Modify");
+
+ if ( m_pTxtNode )
+ {
+ SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich );
+ m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
+ }
+}
+
+sal_Bool SwTxtRuby::GetInfo( SfxPoolItem& rInfo ) const
+{
+ if( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
+ &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
+ {
+ return sal_True;
+ }
+
+ static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
+ return sal_False;
+}
+
+SwCharFmt* SwTxtRuby::GetCharFmt()
+{
+ const SwFmtRuby& rFmt = SwTxtAttrEnd::GetRuby();
+ SwCharFmt* pRet = 0;
+
+ if( rFmt.GetText().Len() )
+ {
+ const SwDoc* pDoc = GetTxtNode().GetDoc();
+ const String& rStr = rFmt.GetCharFmtName();
+ sal_uInt16 nId = RES_POOLCHR_RUBYTEXT;
+ if ( rStr.Len() )
+ nId = rFmt.GetCharFmtId();
+
+ // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
+ // correct charstyle.
+ sal_Bool bResetMod = !pDoc->IsModified();
+ Link aOle2Lnk;
+ if( bResetMod )
+ {
+ aOle2Lnk = pDoc->GetOle2Link();
+ ((SwDoc*)pDoc)->SetOle2Link( Link() );
+ }
+
+ pRet = IsPoolUserFmt( nId )
+ ? ((SwDoc*)pDoc)->FindCharFmtByName( rStr )
+ : ((SwDoc*)pDoc)->GetCharFmtFromPool( nId );
+
+ if( bResetMod )
+ {
+ ((SwDoc*)pDoc)->ResetModified();
+ ((SwDoc*)pDoc)->SetOle2Link( aOle2Lnk );
+ }
+ }
+
+ if( pRet )
+ pRet->Add( this );
+ else if( GetRegisteredIn() )
+ GetRegisteredInNonConst()->Remove( this );
+
+ return pRet;
+}
+
+
+/*************************************************************************
+ * class SwTxtMeta
+ *************************************************************************/
+
+SwTxtMeta *
+SwTxtMeta::CreateTxtMeta(
+ ::sw::MetaFieldManager & i_rTargetDocManager,
+ SwTxtNode *const i_pTargetTxtNode,
+ SwFmtMeta & i_rAttr,
+ xub_StrLen const i_nStart, xub_StrLen const i_nEnd, bool const i_bIsCopy)
+{
+ if (COPY == i_bIsCopy)
+ { // i_rAttr is already cloned, now call DoCopy to copy the sw::Meta
+ OSL_ENSURE(i_pTargetTxtNode, "cannot copy Meta without target node");
+ i_rAttr.DoCopy(i_rTargetDocManager, *i_pTargetTxtNode);
+ }
+ SwTxtMeta *const pTxtMeta(new SwTxtMeta(i_rAttr, i_nStart, i_nEnd));
+ return pTxtMeta;
+}
+
+SwTxtMeta::SwTxtMeta( SwFmtMeta & i_rAttr,
+ const xub_StrLen i_nStart, const xub_StrLen i_nEnd )
+ : SwTxtAttrNesting( i_rAttr, i_nStart, i_nEnd )
+{
+ i_rAttr.SetTxtAttr( this );
+ SetHasDummyChar(true);
+}
+
+SwTxtMeta::~SwTxtMeta()
+{
+ SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) );
+ if (rFmtMeta.GetTxtAttr() == this)
+ {
+ rFmtMeta.SetTxtAttr(0);
+ }
+}
+
+void SwTxtMeta::ChgTxtNode(SwTxtNode * const pNode)
+{
+ SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) );
+ if (rFmtMeta.GetTxtAttr() == this)
+ {
+ rFmtMeta.NotifyChangeTxtNode(pNode);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */