summaryrefslogtreecommitdiff
path: root/sw/source/core/docnode/node.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/docnode/node.cxx')
-rw-r--r--sw/source/core/docnode/node.cxx153
1 files changed, 54 insertions, 99 deletions
diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx
index f8d7170099ee..94fdcb5d54a6 100644
--- a/sw/source/core/docnode/node.cxx
+++ b/sw/source/core/docnode/node.cxx
@@ -28,12 +28,8 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
-
#include <hintids.hxx>
-
-// --> OD 2005-02-21 #i42921#
#include <editeng/frmdiritem.hxx>
-// <--
#include <editeng/protitem.hxx>
#include <com/sun/star/i18n/CharacterIteratorMode.hdl>
#include <fmtcntnt.hxx>
@@ -71,13 +67,11 @@
#include <crsskip.hxx>
#include <SwStyleNameMapper.hxx>
#include <scriptinfo.hxx>
-// --> OD 2005-12-05 #i27138#
#include <rootfrm.hxx>
-// <--
#include <istyleaccess.hxx>
-// --> OD 2007-10-31 #i83479#
#include <IDocumentListItems.hxx>
-// <--
+#include <switerator.hxx>
+#include "ndole.hxx"
using namespace ::com::sun::star::i18n;
@@ -449,15 +443,16 @@ sal_Bool SwNode::IsInVisibleArea( ViewShell* pSh ) const
else
pNd = GetCntntNode();
- const SwFrm* pFrm;
- if( pNd && 0 != ( pFrm = pNd->GetFrm( 0, 0, sal_False ) ) )
- {
- if( !pSh )
- // dann die Shell vom Doc besorgen:
- GetDoc()->GetEditShell( &pSh );
+ if( !pSh )
+ // dann die Shell vom Doc besorgen:
+ GetDoc()->GetEditShell( &pSh );
- if( pSh )
+ if( pSh )
+ {
+ const SwFrm* pFrm;
+ if( pNd && 0 != ( pFrm = pNd->getLayoutFrm( pSh->GetLayout(), 0, 0, sal_False ) ) )
{
+
if ( pFrm->IsInTab() )
pFrm = pFrm->FindTabFrm();
@@ -494,7 +489,7 @@ sal_Bool SwNode::IsProtect() const
if( 0 != ( pSttNd = FindTableBoxStartNode() ) )
{
SwCntntFrm* pCFrm;
- if( IsCntntNode() && 0 != (pCFrm = ((SwCntntNode*)this)->GetFrm() ))
+ if( IsCntntNode() && 0 != (pCFrm = ((SwCntntNode*)this)->getLayoutFrm( GetDoc()->GetCurrentLayout() ) ))
return pCFrm->IsProtected();
const SwTableBox* pBox = pSttNd->FindTableNode()->GetTable().
@@ -563,7 +558,7 @@ const SwPageDesc* SwNode::FindPageDesc( sal_Bool bCalcLay,
{
const SwFrm* pFrm;
const SwPageFrm* pPage;
- if( pNode && 0 != ( pFrm = pNode->GetFrm( 0, 0, bCalcLay ) ) &&
+ if( pNode && 0 != ( pFrm = pNode->getLayoutFrm( pNode->GetDoc()->GetCurrentLayout(), 0, 0, bCalcLay ) ) &&
0 != ( pPage = pFrm->FindPageFrm() ) )
{
pPgDesc = pPage->GetPageDesc();
@@ -787,10 +782,9 @@ SwFrmFmt* SwNode::GetFlyFmt() const
{
if( IsCntntNode() )
{
- SwClientIter aIter( *(SwCntntNode*)this );
- SwClient* pCli = aIter.First( TYPE( SwCntntFrm ));
- if( pCli )
- pRet = ((SwCntntFrm*)pCli)->FindFlyFrm()->GetFmt();
+ SwCntntFrm* pFrm = SwIterator<SwCntntFrm,SwCntntNode>::FirstElement( *(SwCntntNode*)this );
+ if( pFrm )
+ pRet = pFrm->FindFlyFrm()->GetFmt();
}
if( !pRet )
{
@@ -862,8 +856,8 @@ const SwTxtNode* SwNode::FindOutlineNodeOfLevel( sal_uInt8 nLvl ) const
const SwCntntNode* pCNd = GetCntntNode();
Point aPt( 0, 0 );
- const SwFrm* pFrm = pRet->GetFrm( &aPt, 0, sal_False ),
- * pMyFrm = pCNd ? pCNd->GetFrm( &aPt, 0, sal_False ) : 0;
+ const SwFrm* pFrm = pRet->getLayoutFrm( pRet->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ),
+ * pMyFrm = pCNd ? pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ) : 0;
const SwPageFrm* pPgFrm = pFrm ? pFrm->FindPageFrm() : 0;
if( pPgFrm && pMyFrm &&
pPgFrm->Frm().Top() > pMyFrm->Frm().Top() )
@@ -1060,7 +1054,7 @@ SwCntntNode::~SwCntntNode()
((SwAttrSet*)mpAttrSet.get())->SetModifyAtAttr( 0 );
}
-void SwCntntNode::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue )
+void SwCntntNode::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue )
{
sal_uInt16 nWhich = pOldValue ? pOldValue->Which() :
pNewValue ? pNewValue->Which() : 0 ;
@@ -1072,7 +1066,7 @@ void SwCntntNode::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue )
SwFmt * pFmt = (SwFmt *) ((SwPtrMsgPoolItem *)pNewValue)->pObject;
// nicht umhaengen wenn dieses das oberste Format ist !!
- if( pRegisteredIn == pFmt )
+ if( GetRegisteredIn() == pFmt )
{
if( pFmt->GetRegisteredIn() )
{
@@ -1139,7 +1133,7 @@ void SwCntntNode::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue )
break;
}
- SwModify::Modify( pOldValue, pNewValue );
+ NotifyClients( pOldValue, pNewValue );
}
sal_Bool SwCntntNode::InvalidateNumRule()
@@ -1157,12 +1151,10 @@ sal_Bool SwCntntNode::InvalidateNumRule()
return 0 != pRule;
}
-
-SwCntntFrm *SwCntntNode::GetFrm( const Point* pPoint,
- const SwPosition *pPos,
- const sal_Bool bCalcFrm ) const
+SwCntntFrm *SwCntntNode::getLayoutFrm( const SwRootFrm* _pRoot,
+ const Point* pPoint, const SwPosition *pPos, const sal_Bool bCalcFrm ) const
{
- return (SwCntntFrm*) ::GetFrmOfModify( *(SwModify*)this, FRM_CNTNT,
+ return (SwCntntFrm*) ::GetFrmOfModify( _pRoot, *(SwModify*)this, FRM_CNTNT,
pPoint, pPos, bCalcFrm );
}
@@ -1170,7 +1162,7 @@ SwRect SwCntntNode::FindLayoutRect( const sal_Bool bPrtArea, const Point* pPoint
const sal_Bool bCalcFrm ) const
{
SwRect aRet;
- SwCntntFrm* pFrm = (SwCntntFrm*)::GetFrmOfModify( *(SwModify*)this,
+ SwCntntFrm* pFrm = (SwCntntFrm*)::GetFrmOfModify( 0, *(SwModify*)this,
FRM_CNTNT, pPoint, 0, bCalcFrm );
if( pFrm )
aRet = bPrtArea ? pFrm->Prt() : pFrm->Frm();
@@ -1181,7 +1173,7 @@ SwRect SwCntntNode::FindPageFrmRect( const sal_Bool bPrtArea, const Point* pPoin
const sal_Bool bCalcFrm ) const
{
SwRect aRet;
- SwFrm* pFrm = ::GetFrmOfModify( *(SwModify*)this,
+ SwFrm* pFrm = ::GetFrmOfModify( 0, *(SwModify*)this,
FRM_CNTNT, pPoint, 0, bCalcFrm );
if( pFrm && 0 != ( pFrm = pFrm->FindPageFrm() ))
aRet = bPrtArea ? pFrm->Prt() : pFrm->Frm();
@@ -1219,8 +1211,6 @@ SwFmtColl *SwCntntNode::ChgFmtColl( SwFmtColl *pNewColl )
{
SwFmtChg aTmp1( pOldColl );
SwFmtChg aTmp2( pNewColl );
- // damit alles was im Modify passiert hier nicht noch impl.
- // werden muss
SwCntntNode::Modify( &aTmp1, &aTmp2 );
}
}
@@ -1353,7 +1343,7 @@ void SwCntntNode::MakeFrms( SwCntntNode& rNode )
while( 0 != (pUpper = aNode2Layout.UpperFrm( pFrm, rNode )) )
{
- pNew = rNode.MakeFrm();
+ pNew = rNode.MakeFrm( pUpper );
pNew->Paste( pUpper, pFrm );
// --> OD 2005-12-01 #i27138#
// notify accessibility paragraphs objects about changed
@@ -1362,7 +1352,7 @@ void SwCntntNode::MakeFrms( SwCntntNode& rNode )
// and relation CONTENT_FLOWS_TO for previous paragraph will change.
if ( pNew->IsTxtFrm() )
{
- ViewShell* pViewShell( pNew->GetShell() );
+ ViewShell* pViewShell( pNew->getRootFrm()->GetCurrShell() );
if ( pViewShell && pViewShell->GetLayout() &&
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
@@ -1387,60 +1377,7 @@ void SwCntntNode::DelFrms()
if( !GetDepends() )
return;
- SwClientIter aIter( *this );
- SwCntntFrm *pFrm;
-
- for( pFrm = (SwCntntFrm*)aIter.First( TYPE(SwCntntFrm)); pFrm;
- pFrm = (SwCntntFrm*)aIter.Next() )
- {
- // --> OD 2005-12-01 #i27138#
- // notify accessibility paragraphs objects about changed
- // CONTENT_FLOWS_FROM/_TO relation.
- // Relation CONTENT_FLOWS_FROM for current next paragraph will change
- // and relation CONTENT_FLOWS_TO for current previous paragraph will change.
- if ( pFrm->IsTxtFrm() )
- {
- ViewShell* pViewShell( pFrm->GetShell() );
- if ( pViewShell && pViewShell->GetLayout() &&
- pViewShell->GetLayout()->IsAnyShellAccessible() )
- {
- pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTxtFrm*>(pFrm->FindNextCnt( true )),
- dynamic_cast<SwTxtFrm*>(pFrm->FindPrevCnt( true )) );
- }
- }
- // <--
- if( pFrm->HasFollow() )
- pFrm->GetFollow()->_SetIsFollow( pFrm->IsFollow() );
- if( pFrm->IsFollow() )
- {
- SwCntntFrm* pMaster = (SwTxtFrm*)pFrm->FindMaster();
- pMaster->SetFollow( pFrm->GetFollow() );
- pFrm->_SetIsFollow( sal_False );
- }
- pFrm->SetFollow( 0 );//Damit er nicht auf dumme Gedanken kommt.
- //Andernfalls kann es sein, dass ein Follow
- //vor seinem Master zerstoert wird, der Master
- //greift dann ueber den ungueltigen
- //Follow-Pointer auf fremdes Memory zu.
- //Die Kette darf hier zerknauscht werden, weil
- //sowieso alle zerstoert werden.
- if( pFrm->GetUpper() && pFrm->IsInFtn() && !pFrm->GetIndNext() &&
- !pFrm->GetIndPrev() )
- {
- SwFtnFrm *pFtn = pFrm->FindFtnFrm();
- ASSERT( pFtn, "You promised a FtnFrm?" );
- SwCntntFrm* pCFrm;
- if( !pFtn->GetFollow() && !pFtn->GetMaster() &&
- 0 != ( pCFrm = pFtn->GetRefFromAttr()) && pCFrm->IsFollow() )
- {
- ASSERT( pCFrm->IsTxtFrm(), "NoTxtFrm has Footnote?" );
- ((SwTxtFrm*)pCFrm->FindMaster())->Prepare( PREP_FTN_GONE );
- }
- }
- pFrm->Cut();
- delete pFrm;
- }
+ SwCntntFrm::DelFrms(*this);
if( IsTxtNode() )
{
((SwTxtNode*)this)->SetWrong( NULL );
@@ -1511,7 +1448,7 @@ sal_Bool SwCntntNode::GetInfo( SfxPoolItem& rInfo ) const
case RES_CONTENT_VISIBLE:
{
((SwPtrMsgPoolItem&)rInfo).pObject =
- SwClientIter( *(SwCntntNode*)this ).First( TYPE(SwFrm) );
+ SwIterator<SwFrm,SwCntntNode>::FirstElement(*this);
}
return sal_False;
}
@@ -1549,7 +1486,7 @@ sal_Bool SwCntntNode::SetAttr(const SfxPoolItem& rAttr )
{
SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld );
SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew );
- Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
+ ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
}
}
return bRet;
@@ -1625,7 +1562,7 @@ sal_Bool SwCntntNode::SetAttr( const SfxItemSet& rSet )
// einige Sonderbehandlungen fuer Attribute
SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld );
SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew );
- Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
+ ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
}
}
return bRet;
@@ -1675,7 +1612,7 @@ sal_Bool SwCntntNode::ResetAttr( sal_uInt16 nWhich1, sal_uInt16 nWhich2 )
{
SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld );
SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew );
- Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
+ ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
if( !GetpSwAttrSet()->Count() ) // leer, dann loeschen
mpAttrSet.reset();//DELETEZ( mpAttrSet );
@@ -1716,7 +1653,7 @@ sal_Bool SwCntntNode::ResetAttr( const SvUShorts& rWhichArr )
{
SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld );
SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew );
- Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
+ ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
}
}
if( !GetpSwAttrSet()->Count() ) // leer, dann loeschen
@@ -1755,7 +1692,7 @@ sal_uInt16 SwCntntNode::ResetAllAttr()
{
SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld );
SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew );
- Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
+ ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt
if( !GetpSwAttrSet()->Count() ) // leer, dann loeschen
mpAttrSet.reset();//DELETEZ( mpAttrSet );
@@ -1895,7 +1832,7 @@ void SwCntntNode::SetCondFmtColl( SwFmtColl* pColl )
{
SwFmtChg aTmp1( pOldColl ? pOldColl : GetFmtColl() );
SwFmtChg aTmp2( pColl ? pColl : GetFmtColl() );
- SwModify::Modify( &aTmp1, &aTmp2 );
+ NotifyClients( &aTmp1, &aTmp2 );
}
if( IsInCache() )
{
@@ -2049,7 +1986,7 @@ short SwCntntNode::GetTextDirection( const SwPosition& rPos,
// --> OD 2007-01-10 #i72024#
// No format of the frame, because this can cause recursive layout actions
- SwFrm* pFrm = GetFrm( &aPt, &rPos, sal_False );
+ SwFrm* pFrm = getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, &rPos, sal_False );
// <--
if ( pFrm )
@@ -2075,6 +2012,24 @@ short SwCntntNode::GetTextDirection( const SwPosition& rPos,
}
// <--
+SwOLENodes* SwCntntNode::CreateOLENodesArray( const SwFmtColl& rColl, bool bOnlyWithInvalidSize )
+{
+ SwOLENodes *pNodes = 0;
+ SwIterator<SwCntntNode,SwFmtColl> aIter( rColl );
+ for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() )
+ {
+ SwOLENode *pONd = pNd->GetOLENode();
+ if ( pONd && (!bOnlyWithInvalidSize || pONd->IsOLESizeInvalid()) )
+ {
+ if ( !pNodes )
+ pNodes = new SwOLENodes;
+ pNodes->Insert( pONd, pNodes->Count() );
+ }
+ }
+
+ return pNodes;
+}
+
//FEATURE::CONDCOLL
// Metoden aus Node.hxx - erst hier ist der TxtNode bekannt !!
// os: nur fuer ICC, da der zum optimieren zu dumm ist