xref: /trunk/main/sw/source/core/undo/unspnd.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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
10cdf0e10cSrcweir  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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 }
200