xref: /aoo41x/main/sw/source/core/undo/unspnd.cxx (revision efeef26f)
1*efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*efeef26fSAndrew Rist  * distributed with this work for additional information
6*efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*efeef26fSAndrew Rist  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*efeef26fSAndrew Rist  *
13*efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*efeef26fSAndrew Rist  * specific language governing permissions and limitations
18*efeef26fSAndrew Rist  * under the License.
19*efeef26fSAndrew Rist  *
20*efeef26fSAndrew Rist  *************************************************************/
21*efeef26fSAndrew Rist 
22*efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <UndoSplitMove.hxx>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "doc.hxx"
30cdf0e10cSrcweir #include "pam.hxx"
31cdf0e10cSrcweir #include "swtable.hxx"
32cdf0e10cSrcweir #include "ndtxt.hxx"
33cdf0e10cSrcweir #include "swundo.hxx"           // fuer die UndoIds
34cdf0e10cSrcweir #include <editeng/brkitem.hxx>
35cdf0e10cSrcweir #include <fmtpdsc.hxx>
36cdf0e10cSrcweir #include <frmfmt.hxx>
37cdf0e10cSrcweir #include <UndoCore.hxx>
38cdf0e10cSrcweir #include "rolbck.hxx"
39cdf0e10cSrcweir #include "redline.hxx"
40cdf0e10cSrcweir #include "docary.hxx"
41cdf0e10cSrcweir #include <IShellCursorSupplier.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir 
44cdf0e10cSrcweir //------------------------------------------------------------------
45cdf0e10cSrcweir 
46cdf0e10cSrcweir // SPLITNODE
47cdf0e10cSrcweir 
48cdf0e10cSrcweir 
SwUndoSplitNode(SwDoc * pDoc,const SwPosition & rPos,sal_Bool bChkTable)49cdf0e10cSrcweir SwUndoSplitNode::SwUndoSplitNode( SwDoc* pDoc, const SwPosition& rPos,
50cdf0e10cSrcweir 									sal_Bool bChkTable )
51cdf0e10cSrcweir 	: SwUndo( UNDO_SPLITNODE ), pHistory( 0 ), pRedlData( 0 ), nNode( rPos.nNode.GetIndex() ),
52cdf0e10cSrcweir 		nCntnt( rPos.nContent.GetIndex() ),
53cdf0e10cSrcweir 		bTblFlag( sal_False ), bChkTblStt( bChkTable )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir     SwTxtNode *const pTxtNd = rPos.nNode.GetNode().GetTxtNode();
56cdf0e10cSrcweir     OSL_ENSURE(pTxtNd, "SwUndoSplitNode: TextNode expected!");
57cdf0e10cSrcweir 	if( pTxtNd->GetpSwpHints() )
58cdf0e10cSrcweir 	{
59cdf0e10cSrcweir 		pHistory = new SwHistory;
60cdf0e10cSrcweir         pHistory->CopyAttr( pTxtNd->GetpSwpHints(), nNode, 0,
61cdf0e10cSrcweir                             pTxtNd->GetTxt().Len(), false );
62cdf0e10cSrcweir 		if( !pHistory->Count() )
63cdf0e10cSrcweir 			DELETEZ( pHistory );
64cdf0e10cSrcweir 	}
65cdf0e10cSrcweir 	// Redline beachten
66cdf0e10cSrcweir 	if( pDoc->IsRedlineOn() )
67cdf0e10cSrcweir 	{
68cdf0e10cSrcweir 		pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, pDoc->GetRedlineAuthor() );
69cdf0e10cSrcweir 		SetRedlineMode( pDoc->GetRedlineMode() );
70cdf0e10cSrcweir 	}
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
~SwUndoSplitNode()73cdf0e10cSrcweir SwUndoSplitNode::~SwUndoSplitNode()
74cdf0e10cSrcweir {
75cdf0e10cSrcweir 	delete pHistory;
76cdf0e10cSrcweir 	delete pRedlData;
77cdf0e10cSrcweir }
78cdf0e10cSrcweir 
UndoImpl(::sw::UndoRedoContext & rContext)79cdf0e10cSrcweir void SwUndoSplitNode::UndoImpl(::sw::UndoRedoContext & rContext)
80cdf0e10cSrcweir {
81cdf0e10cSrcweir     SwDoc *const pDoc = & rContext.GetDoc();
82cdf0e10cSrcweir     SwPaM & rPam( rContext.GetCursorSupplier().CreateNewShellCursor() );
83cdf0e10cSrcweir 	rPam.DeleteMark();
84cdf0e10cSrcweir 	if( bTblFlag )
85cdf0e10cSrcweir 	{
86cdf0e10cSrcweir 		// dann wurde direkt vor der akt. Tabelle ein TextNode eingefuegt.
87cdf0e10cSrcweir 		SwNodeIndex& rIdx = rPam.GetPoint()->nNode;
88cdf0e10cSrcweir 		rIdx = nNode;
89cdf0e10cSrcweir 		SwTxtNode* pTNd;
90cdf0e10cSrcweir 		SwNode* pCurrNd = pDoc->GetNodes()[ nNode + 1 ];
91cdf0e10cSrcweir 		SwTableNode* pTblNd = pCurrNd->FindTableNode();
92cdf0e10cSrcweir 		if( pCurrNd->IsCntntNode() && pTblNd &&
93cdf0e10cSrcweir 			0 != ( pTNd = pDoc->GetNodes()[ pTblNd->GetIndex()-1 ]->GetTxtNode() ))
94cdf0e10cSrcweir 		{
95cdf0e10cSrcweir 			// verschiebe die BreakAttribute noch
96cdf0e10cSrcweir 			SwFrmFmt* pTableFmt = pTblNd->GetTable().GetFrmFmt();
97cdf0e10cSrcweir 			const SfxItemSet* pNdSet = pTNd->GetpSwAttrSet();
98cdf0e10cSrcweir 			if( pNdSet )
99cdf0e10cSrcweir 			{
100cdf0e10cSrcweir 				const SfxPoolItem *pItem;
101cdf0e10cSrcweir 				if( SFX_ITEM_SET == pNdSet->GetItemState( RES_PAGEDESC, sal_False,
102cdf0e10cSrcweir 					&pItem ) )
103cdf0e10cSrcweir                     pTableFmt->SetFmtAttr( *pItem );
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 				if( SFX_ITEM_SET == pNdSet->GetItemState( RES_BREAK, sal_False,
106cdf0e10cSrcweir 					 &pItem ) )
107cdf0e10cSrcweir                     pTableFmt->SetFmtAttr( *pItem );
108cdf0e10cSrcweir 			}
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 			// dann loesche den wieder
111cdf0e10cSrcweir 			SwNodeIndex aDelNd( *pTblNd, -1 );
112cdf0e10cSrcweir 			rPam.GetPoint()->nContent.Assign( (SwCntntNode*)pCurrNd, 0 );
113cdf0e10cSrcweir 			RemoveIdxRel( aDelNd.GetIndex(), *rPam.GetPoint() );
114cdf0e10cSrcweir 			pDoc->GetNodes().Delete( aDelNd );
115cdf0e10cSrcweir 		}
116cdf0e10cSrcweir 	}
117cdf0e10cSrcweir 	else
118cdf0e10cSrcweir 	{
119cdf0e10cSrcweir 		SwTxtNode * pTNd = pDoc->GetNodes()[ nNode ]->GetTxtNode();
120cdf0e10cSrcweir 		if( pTNd )
121cdf0e10cSrcweir 		{
122cdf0e10cSrcweir 			rPam.GetPoint()->nNode = *pTNd;
123cdf0e10cSrcweir 			rPam.GetPoint()->nContent.Assign( pTNd, pTNd->GetTxt().Len() );
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 			if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ))
126cdf0e10cSrcweir 			{
127cdf0e10cSrcweir 				rPam.SetMark();
128cdf0e10cSrcweir 				rPam.GetMark()->nNode++;
129cdf0e10cSrcweir 				rPam.GetMark()->nContent.Assign( rPam.GetMark()->
130cdf0e10cSrcweir 									nNode.GetNode().GetCntntNode(), 0 );
131cdf0e10cSrcweir 				pDoc->DeleteRedline( rPam, true, USHRT_MAX );
132cdf0e10cSrcweir 				rPam.DeleteMark();
133cdf0e10cSrcweir 			}
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 			RemoveIdxRel( nNode+1, *rPam.GetPoint() );
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 			pTNd->JoinNext();
138cdf0e10cSrcweir 			if( pHistory )
139cdf0e10cSrcweir 			{
140cdf0e10cSrcweir 				rPam.GetPoint()->nContent = 0;
141cdf0e10cSrcweir 				rPam.SetMark();
142cdf0e10cSrcweir 				rPam.GetPoint()->nContent = pTNd->GetTxt().Len();
143cdf0e10cSrcweir 
144cdf0e10cSrcweir                 pDoc->RstTxtAttrs( rPam, sal_True );
145cdf0e10cSrcweir                 pHistory->TmpRollback( pDoc, 0, false );
146cdf0e10cSrcweir             }
147cdf0e10cSrcweir         }
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	// setze noch den Cursor auf den Undo-Bereich
151cdf0e10cSrcweir 	rPam.DeleteMark();
152cdf0e10cSrcweir 	rPam.GetPoint()->nNode = nNode;
153cdf0e10cSrcweir 	rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), nCntnt );
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
RedoImpl(::sw::UndoRedoContext & rContext)156cdf0e10cSrcweir void SwUndoSplitNode::RedoImpl(::sw::UndoRedoContext & rContext)
157cdf0e10cSrcweir {
158cdf0e10cSrcweir     SwPaM & rPam( rContext.GetCursorSupplier().CreateNewShellCursor() );
159cdf0e10cSrcweir 	rPam.GetPoint()->nNode = nNode;
160cdf0e10cSrcweir 	SwTxtNode * pTNd = rPam.GetNode()->GetTxtNode();
161cdf0e10cSrcweir     OSL_ENSURE(pTNd, "SwUndoSplitNode::RedoImpl(): SwTxtNode expected");
162cdf0e10cSrcweir     if (pTNd)
163cdf0e10cSrcweir 	{
164cdf0e10cSrcweir 		rPam.GetPoint()->nContent.Assign( pTNd, nCntnt );
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 		SwDoc* pDoc = rPam.GetDoc();
167cdf0e10cSrcweir 		pDoc->SplitNode( *rPam.GetPoint(), bChkTblStt );
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 		if( pHistory )
170cdf0e10cSrcweir 			pHistory->SetTmpEnd( pHistory->Count() );
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 		if( ( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) ||
173cdf0e10cSrcweir 			( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) &&
174cdf0e10cSrcweir 				pDoc->GetRedlineTbl().Count() ))
175cdf0e10cSrcweir 		{
176cdf0e10cSrcweir 			rPam.SetMark();
177cdf0e10cSrcweir 			if( rPam.Move( fnMoveBackward ))
178cdf0e10cSrcweir 			{
179cdf0e10cSrcweir 				if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ))
180cdf0e10cSrcweir 				{
181cdf0e10cSrcweir 					RedlineMode_t eOld = pDoc->GetRedlineMode();
182cdf0e10cSrcweir 					pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE));
183cdf0e10cSrcweir 					pDoc->AppendRedline( new SwRedline( *pRedlData, rPam ), true);
184cdf0e10cSrcweir 					pDoc->SetRedlineMode_intern( eOld );
185cdf0e10cSrcweir 				}
186cdf0e10cSrcweir 				else
187cdf0e10cSrcweir 					pDoc->SplitRedline( rPam );
188cdf0e10cSrcweir 				rPam.Exchange();
189cdf0e10cSrcweir 			}
190cdf0e10cSrcweir 			rPam.DeleteMark();
191cdf0e10cSrcweir 		}
192cdf0e10cSrcweir 	}
193cdf0e10cSrcweir }
194cdf0e10cSrcweir 
RepeatImpl(::sw::RepeatContext & rContext)195cdf0e10cSrcweir void SwUndoSplitNode::RepeatImpl(::sw::RepeatContext & rContext)
196cdf0e10cSrcweir {
197cdf0e10cSrcweir     rContext.GetDoc().SplitNode(
198cdf0e10cSrcweir         *rContext.GetRepeatPaM().GetPoint(), bChkTblStt );
199cdf0e10cSrcweir }
200cdf0e10cSrcweir 
201