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