xref: /AOO41X/main/svtools/source/edit/textundo.cxx (revision 5900e8ec128faec89519683efce668ccd8cc6084)
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