1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*5900e8ecSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*5900e8ecSAndrew Rist * distributed with this work for additional information
6*5900e8ecSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*5900e8ecSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*5900e8ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*5900e8ecSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist * KIND, either express or implied. See the License for the
17*5900e8ecSAndrew Rist * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*5900e8ecSAndrew Rist *************************************************************/
21*5900e8ecSAndrew Rist
22*5900e8ecSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <svtools/texteng.hxx>
28cdf0e10cSrcweir #include <svtools/textview.hxx>
29cdf0e10cSrcweir #include <textundo.hxx>
30cdf0e10cSrcweir #include <textund2.hxx>
31cdf0e10cSrcweir #include <svtools/textdata.hxx>
32cdf0e10cSrcweir #include <textdoc.hxx>
33cdf0e10cSrcweir #include <textdat2.hxx>
34cdf0e10cSrcweir
35cdf0e10cSrcweir TYPEINIT1( TextUndo, SfxUndoAction );
36cdf0e10cSrcweir TYPEINIT1( TextUndoDelPara, TextUndo );
37cdf0e10cSrcweir TYPEINIT1( TextUndoConnectParas, TextUndo );
38cdf0e10cSrcweir TYPEINIT1( TextUndoSplitPara, TextUndo );
39cdf0e10cSrcweir TYPEINIT1( TextUndoInsertChars, TextUndo );
40cdf0e10cSrcweir TYPEINIT1( TextUndoRemoveChars, TextUndo );
41cdf0e10cSrcweir TYPEINIT1( TextUndoSetAttribs, TextUndo );
42cdf0e10cSrcweir
43cdf0e10cSrcweir
TextUndoManager(TextEngine * p)44cdf0e10cSrcweir TextUndoManager::TextUndoManager( TextEngine* p )
45cdf0e10cSrcweir {
46cdf0e10cSrcweir mpTextEngine = p;
47cdf0e10cSrcweir }
48cdf0e10cSrcweir
~TextUndoManager()49cdf0e10cSrcweir TextUndoManager::~TextUndoManager()
50cdf0e10cSrcweir {
51cdf0e10cSrcweir }
52cdf0e10cSrcweir
Undo()53cdf0e10cSrcweir sal_Bool __EXPORT TextUndoManager::Undo()
54cdf0e10cSrcweir {
55cdf0e10cSrcweir if ( GetUndoActionCount() == 0 )
56cdf0e10cSrcweir return sal_False;
57cdf0e10cSrcweir
58cdf0e10cSrcweir UndoRedoStart();
59cdf0e10cSrcweir
60cdf0e10cSrcweir mpTextEngine->SetIsInUndo( sal_True );
61cdf0e10cSrcweir sal_Bool bDone = SfxUndoManager::Undo();
62cdf0e10cSrcweir mpTextEngine->SetIsInUndo( sal_False );
63cdf0e10cSrcweir
64cdf0e10cSrcweir UndoRedoEnd();
65cdf0e10cSrcweir
66cdf0e10cSrcweir return bDone;
67cdf0e10cSrcweir }
68cdf0e10cSrcweir
Redo()69cdf0e10cSrcweir sal_Bool __EXPORT TextUndoManager::Redo()
70cdf0e10cSrcweir {
71cdf0e10cSrcweir if ( GetRedoActionCount() == 0 )
72cdf0e10cSrcweir return sal_False;
73cdf0e10cSrcweir
74cdf0e10cSrcweir
75cdf0e10cSrcweir UndoRedoStart();
76cdf0e10cSrcweir
77cdf0e10cSrcweir mpTextEngine->SetIsInUndo( sal_True );
78cdf0e10cSrcweir sal_Bool bDone = SfxUndoManager::Redo();
79cdf0e10cSrcweir mpTextEngine->SetIsInUndo( sal_False );
80cdf0e10cSrcweir
81cdf0e10cSrcweir UndoRedoEnd();
82cdf0e10cSrcweir
83cdf0e10cSrcweir return bDone;
84cdf0e10cSrcweir }
85cdf0e10cSrcweir
UndoRedoStart()86cdf0e10cSrcweir void TextUndoManager::UndoRedoStart()
87cdf0e10cSrcweir {
88cdf0e10cSrcweir DBG_ASSERT( GetView(), "Undo/Redo: Active View?" );
89cdf0e10cSrcweir
90cdf0e10cSrcweir // if ( GetView() )
91cdf0e10cSrcweir // GetView()->HideSelection();
92cdf0e10cSrcweir }
93cdf0e10cSrcweir
UndoRedoEnd()94cdf0e10cSrcweir void TextUndoManager::UndoRedoEnd()
95cdf0e10cSrcweir {
96cdf0e10cSrcweir if ( GetView() )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir TextSelection aNewSel( GetView()->GetSelection() );
99cdf0e10cSrcweir aNewSel.GetStart() = aNewSel.GetEnd();
100cdf0e10cSrcweir GetView()->ImpSetSelection( aNewSel );
101cdf0e10cSrcweir }
102cdf0e10cSrcweir
103cdf0e10cSrcweir mpTextEngine->UpdateSelections();
104cdf0e10cSrcweir
105cdf0e10cSrcweir mpTextEngine->FormatAndUpdate( GetView() );
106cdf0e10cSrcweir }
107cdf0e10cSrcweir
108cdf0e10cSrcweir
TextUndo(TextEngine * p)109cdf0e10cSrcweir TextUndo::TextUndo( TextEngine* p )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir mpTextEngine = p;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir
~TextUndo()114cdf0e10cSrcweir TextUndo::~TextUndo()
115cdf0e10cSrcweir {
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
GetComment() const118cdf0e10cSrcweir XubString __EXPORT TextUndo::GetComment() const
119cdf0e10cSrcweir {
120cdf0e10cSrcweir // return mpTextEngine->GetUndoComment( this );
121cdf0e10cSrcweir return String();
122cdf0e10cSrcweir }
123cdf0e10cSrcweir
SetSelection(const TextSelection & rSel)124cdf0e10cSrcweir void TextUndo::SetSelection( const TextSelection& rSel )
125cdf0e10cSrcweir {
126cdf0e10cSrcweir if ( GetView() )
127cdf0e10cSrcweir GetView()->ImpSetSelection( rSel );
128cdf0e10cSrcweir }
129cdf0e10cSrcweir
130cdf0e10cSrcweir
TextUndoDelPara(TextEngine * pTextEngine,TextNode * pNode,sal_uLong nPara)131cdf0e10cSrcweir TextUndoDelPara::TextUndoDelPara( TextEngine* pTextEngine, TextNode* pNode, sal_uLong nPara )
132cdf0e10cSrcweir : TextUndo( pTextEngine )
133cdf0e10cSrcweir {
134cdf0e10cSrcweir mpNode = pNode;
135cdf0e10cSrcweir mnPara = nPara;
136cdf0e10cSrcweir mbDelObject = sal_True;
137cdf0e10cSrcweir }
138cdf0e10cSrcweir
~TextUndoDelPara()139cdf0e10cSrcweir TextUndoDelPara::~TextUndoDelPara()
140cdf0e10cSrcweir {
141cdf0e10cSrcweir if ( mbDelObject )
142cdf0e10cSrcweir delete mpNode;
143cdf0e10cSrcweir }
144cdf0e10cSrcweir
Undo()145cdf0e10cSrcweir void __EXPORT TextUndoDelPara::Undo()
146cdf0e10cSrcweir {
147cdf0e10cSrcweir GetTextEngine()->InsertContent( mpNode, mnPara );
148cdf0e10cSrcweir mbDelObject = sal_False; // gehoert wieder der Engine
149cdf0e10cSrcweir
150cdf0e10cSrcweir if ( GetView() )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir TextSelection aSel( TextPaM( mnPara, 0 ), TextPaM( mnPara, mpNode->GetText().Len() ) );
153cdf0e10cSrcweir SetSelection( aSel );
154cdf0e10cSrcweir }
155cdf0e10cSrcweir }
156cdf0e10cSrcweir
Redo()157cdf0e10cSrcweir void __EXPORT TextUndoDelPara::Redo()
158cdf0e10cSrcweir {
159cdf0e10cSrcweir // pNode stimmt nicht mehr, falls zwischendurch Undos, in denen
160cdf0e10cSrcweir // Absaetze verschmolzen sind.
161cdf0e10cSrcweir mpNode = GetDoc()->GetNodes().GetObject( mnPara );
162cdf0e10cSrcweir
163cdf0e10cSrcweir delete GetTEParaPortions()->GetObject( mnPara );
164cdf0e10cSrcweir GetTEParaPortions()->Remove( mnPara );
165cdf0e10cSrcweir
166cdf0e10cSrcweir // Node nicht loeschen, haengt im Undo!
167cdf0e10cSrcweir GetDoc()->GetNodes().Remove( mnPara );
168cdf0e10cSrcweir GetTextEngine()->ImpParagraphRemoved( mnPara );
169cdf0e10cSrcweir
170cdf0e10cSrcweir mbDelObject = sal_True; // gehoert wieder dem Undo
171cdf0e10cSrcweir
172cdf0e10cSrcweir sal_uLong nParas = GetDoc()->GetNodes().Count();
173cdf0e10cSrcweir sal_uLong n = mnPara < nParas ? mnPara : (nParas-1);
174cdf0e10cSrcweir TextNode* pN = GetDoc()->GetNodes().GetObject( n );
175cdf0e10cSrcweir TextPaM aPaM( n, pN->GetText().Len() );
176cdf0e10cSrcweir SetSelection( aPaM );
177cdf0e10cSrcweir }
178cdf0e10cSrcweir
179cdf0e10cSrcweir // -----------------------------------------------------------------------
180cdf0e10cSrcweir // TextUndoConnectParas
181cdf0e10cSrcweir // ------------------------------------------------------------------------
TextUndoConnectParas(TextEngine * pTextEngine,sal_uLong nPara,sal_uInt16 nPos)182cdf0e10cSrcweir TextUndoConnectParas::TextUndoConnectParas( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nPos )
183cdf0e10cSrcweir : TextUndo( pTextEngine )
184cdf0e10cSrcweir {
185cdf0e10cSrcweir mnPara = nPara;
186cdf0e10cSrcweir mnSepPos = nPos;
187cdf0e10cSrcweir }
188cdf0e10cSrcweir
~TextUndoConnectParas()189cdf0e10cSrcweir TextUndoConnectParas::~TextUndoConnectParas()
190cdf0e10cSrcweir {
191cdf0e10cSrcweir }
192cdf0e10cSrcweir
Undo()193cdf0e10cSrcweir void __EXPORT TextUndoConnectParas::Undo()
194cdf0e10cSrcweir {
195cdf0e10cSrcweir TextPaM aPaM = GetTextEngine()->SplitContent( mnPara, mnSepPos );
196cdf0e10cSrcweir SetSelection( aPaM );
197cdf0e10cSrcweir }
198cdf0e10cSrcweir
Redo()199cdf0e10cSrcweir void __EXPORT TextUndoConnectParas::Redo()
200cdf0e10cSrcweir {
201cdf0e10cSrcweir TextPaM aPaM = GetTextEngine()->ConnectContents( mnPara );
202cdf0e10cSrcweir SetSelection( aPaM );
203cdf0e10cSrcweir }
204cdf0e10cSrcweir
205cdf0e10cSrcweir
TextUndoSplitPara(TextEngine * pTextEngine,sal_uLong nPara,sal_uInt16 nPos)206cdf0e10cSrcweir TextUndoSplitPara::TextUndoSplitPara( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nPos )
207cdf0e10cSrcweir : TextUndo( pTextEngine )
208cdf0e10cSrcweir {
209cdf0e10cSrcweir mnPara = nPara;
210cdf0e10cSrcweir mnSepPos = nPos;
211cdf0e10cSrcweir }
212cdf0e10cSrcweir
~TextUndoSplitPara()213cdf0e10cSrcweir TextUndoSplitPara::~TextUndoSplitPara()
214cdf0e10cSrcweir {
215cdf0e10cSrcweir }
216cdf0e10cSrcweir
Undo()217cdf0e10cSrcweir void __EXPORT TextUndoSplitPara::Undo()
218cdf0e10cSrcweir {
219cdf0e10cSrcweir TextPaM aPaM = GetTextEngine()->ConnectContents( mnPara );
220cdf0e10cSrcweir SetSelection( aPaM );
221cdf0e10cSrcweir }
222cdf0e10cSrcweir
Redo()223cdf0e10cSrcweir void __EXPORT TextUndoSplitPara::Redo()
224cdf0e10cSrcweir {
225cdf0e10cSrcweir TextPaM aPaM = GetTextEngine()->SplitContent( mnPara, mnSepPos );
226cdf0e10cSrcweir SetSelection( aPaM );
227cdf0e10cSrcweir }
228cdf0e10cSrcweir
229cdf0e10cSrcweir
TextUndoInsertChars(TextEngine * pTextEngine,const TextPaM & rTextPaM,const XubString & rStr)230cdf0e10cSrcweir TextUndoInsertChars::TextUndoInsertChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const XubString& rStr )
231cdf0e10cSrcweir : TextUndo( pTextEngine ),
232cdf0e10cSrcweir maTextPaM( rTextPaM ), maText( rStr )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir }
235cdf0e10cSrcweir
Undo()236cdf0e10cSrcweir void __EXPORT TextUndoInsertChars::Undo()
237cdf0e10cSrcweir {
238cdf0e10cSrcweir TextSelection aSel( maTextPaM, maTextPaM );
239cdf0e10cSrcweir aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len();
240cdf0e10cSrcweir TextPaM aPaM = GetTextEngine()->ImpDeleteText( aSel );
241cdf0e10cSrcweir SetSelection( aPaM );
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
Redo()244cdf0e10cSrcweir void __EXPORT TextUndoInsertChars::Redo()
245cdf0e10cSrcweir {
246cdf0e10cSrcweir TextSelection aSel( maTextPaM, maTextPaM );
247cdf0e10cSrcweir GetTextEngine()->ImpInsertText( aSel, maText );
248cdf0e10cSrcweir TextPaM aNewPaM( maTextPaM );
249cdf0e10cSrcweir aNewPaM.GetIndex() = aNewPaM.GetIndex() + maText.Len();
250cdf0e10cSrcweir SetSelection( TextSelection( aSel.GetStart(), aNewPaM ) );
251cdf0e10cSrcweir }
252cdf0e10cSrcweir
Merge(SfxUndoAction * pNextAction)253cdf0e10cSrcweir sal_Bool __EXPORT TextUndoInsertChars::Merge( SfxUndoAction* pNextAction )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir if ( !pNextAction->ISA( TextUndoInsertChars ) )
256cdf0e10cSrcweir return sal_False;
257cdf0e10cSrcweir
258cdf0e10cSrcweir TextUndoInsertChars* pNext = (TextUndoInsertChars*)pNextAction;
259cdf0e10cSrcweir
260cdf0e10cSrcweir if ( maTextPaM.GetPara() != pNext->maTextPaM.GetPara() )
261cdf0e10cSrcweir return sal_False;
262cdf0e10cSrcweir
263cdf0e10cSrcweir if ( ( maTextPaM.GetIndex() + maText.Len() ) == pNext->maTextPaM.GetIndex() )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir maText += pNext->maText;
266cdf0e10cSrcweir return sal_True;
267cdf0e10cSrcweir }
268cdf0e10cSrcweir return sal_False;
269cdf0e10cSrcweir }
270cdf0e10cSrcweir
271cdf0e10cSrcweir
TextUndoRemoveChars(TextEngine * pTextEngine,const TextPaM & rTextPaM,const XubString & rStr)272cdf0e10cSrcweir TextUndoRemoveChars::TextUndoRemoveChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const XubString& rStr )
273cdf0e10cSrcweir : TextUndo( pTextEngine ),
274cdf0e10cSrcweir maTextPaM( rTextPaM ), maText( rStr )
275cdf0e10cSrcweir {
276cdf0e10cSrcweir }
277cdf0e10cSrcweir
Undo()278cdf0e10cSrcweir void __EXPORT TextUndoRemoveChars::Undo()
279cdf0e10cSrcweir {
280cdf0e10cSrcweir TextSelection aSel( maTextPaM, maTextPaM );
281cdf0e10cSrcweir GetTextEngine()->ImpInsertText( aSel, maText );
282cdf0e10cSrcweir aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len();
283cdf0e10cSrcweir SetSelection( aSel );
284cdf0e10cSrcweir }
285cdf0e10cSrcweir
Redo()286cdf0e10cSrcweir void __EXPORT TextUndoRemoveChars::Redo()
287cdf0e10cSrcweir {
288cdf0e10cSrcweir TextSelection aSel( maTextPaM, maTextPaM );
289cdf0e10cSrcweir aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len();
290cdf0e10cSrcweir TextPaM aPaM = GetTextEngine()->ImpDeleteText( aSel );
291cdf0e10cSrcweir SetSelection( aPaM );
292cdf0e10cSrcweir }
293cdf0e10cSrcweir
294cdf0e10cSrcweir
TextUndoSetAttribs(TextEngine * pTextEngine,const TextSelection & rSel)295cdf0e10cSrcweir TextUndoSetAttribs::TextUndoSetAttribs( TextEngine* pTextEngine, const TextSelection& rSel )
296cdf0e10cSrcweir : TextUndo( pTextEngine ), maSelection( rSel )
297cdf0e10cSrcweir {
298cdf0e10cSrcweir maSelection.Justify();
299cdf0e10cSrcweir // aNewAttribs.Set( rNewItems );
300cdf0e10cSrcweir // mbSetIsRemove = sal_False;
301cdf0e10cSrcweir // mnRemoveWhich = 0;
302cdf0e10cSrcweir // mnSpecial = 0;
303cdf0e10cSrcweir }
304cdf0e10cSrcweir
~TextUndoSetAttribs()305cdf0e10cSrcweir TextUndoSetAttribs::~TextUndoSetAttribs()
306cdf0e10cSrcweir {
307cdf0e10cSrcweir // ...............
308cdf0e10cSrcweir }
309cdf0e10cSrcweir
Undo()310cdf0e10cSrcweir void __EXPORT TextUndoSetAttribs::Undo()
311cdf0e10cSrcweir {
312cdf0e10cSrcweir for ( sal_uLong nPara = maSelection.GetStart().GetPara(); nPara <= maSelection.GetEnd().GetPara(); nPara++ )
313cdf0e10cSrcweir {
314cdf0e10cSrcweir // ContentAttribsInfo* pInf = aPrevAttribs[ (sal_uInt16)(nPara-aESel.nStartPara) ];
315cdf0e10cSrcweir // GetTextEngine()->RemoveCharAttribs( nPara );
316cdf0e10cSrcweir // TextNode* pNode = GetTextEngine()->GetTextDoc().GetObject( nPara );
317cdf0e10cSrcweir // for ( sal_uInt16 nAttr = 0; nAttr < pInf->GetPrevCharAttribs().Count(); nAttr++ )
318cdf0e10cSrcweir // {
319cdf0e10cSrcweir // GetTextEngine()->GetTextDoc().InsertAttrib( pNode, pX->GetStart(), pX->GetEnd(), *pX->GetItem() );
320cdf0e10cSrcweir // }
321cdf0e10cSrcweir }
322cdf0e10cSrcweir SetSelection( maSelection );
323cdf0e10cSrcweir }
324cdf0e10cSrcweir
Redo()325cdf0e10cSrcweir void __EXPORT TextUndoSetAttribs::Redo()
326cdf0e10cSrcweir {
327cdf0e10cSrcweir // if ( !bSetIsRemove )
328cdf0e10cSrcweir // GetTextEngine()->SetAttribs( aSel, aNewAttribs, nSpecial );
329cdf0e10cSrcweir // else
330cdf0e10cSrcweir // GetTextEngine()->RemoveCharAttribs( aSel, bRemoveParaAttribs, nRemoveWhich );
331cdf0e10cSrcweir SetSelection( maSelection );
332cdf0e10cSrcweir }
333