blob: 99eaf7b67aed7b3eae2664a2fd067c333400e822 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svtools.hxx"
#include <svtools/texteng.hxx>
#include <svtools/textview.hxx>
#include <textundo.hxx>
#include <textund2.hxx>
#include <svtools/textdata.hxx>
#include <textdoc.hxx>
#include <textdat2.hxx>
TYPEINIT1( TextUndo, SfxUndoAction );
TYPEINIT1( TextUndoDelPara, TextUndo );
TYPEINIT1( TextUndoConnectParas, TextUndo );
TYPEINIT1( TextUndoSplitPara, TextUndo );
TYPEINIT1( TextUndoInsertChars, TextUndo );
TYPEINIT1( TextUndoRemoveChars, TextUndo );
TYPEINIT1( TextUndoSetAttribs, TextUndo );
TextUndoManager::TextUndoManager( TextEngine* p )
{
mpTextEngine = p;
}
TextUndoManager::~TextUndoManager()
{
}
sal_Bool __EXPORT TextUndoManager::Undo()
{
if ( GetUndoActionCount() == 0 )
return sal_False;
UndoRedoStart();
mpTextEngine->SetIsInUndo( sal_True );
sal_Bool bDone = SfxUndoManager::Undo();
mpTextEngine->SetIsInUndo( sal_False );
UndoRedoEnd();
return bDone;
}
sal_Bool __EXPORT TextUndoManager::Redo()
{
if ( GetRedoActionCount() == 0 )
return sal_False;
UndoRedoStart();
mpTextEngine->SetIsInUndo( sal_True );
sal_Bool bDone = SfxUndoManager::Redo();
mpTextEngine->SetIsInUndo( sal_False );
UndoRedoEnd();
return bDone;
}
void TextUndoManager::UndoRedoStart()
{
DBG_ASSERT( GetView(), "Undo/Redo: Active View?" );
// if ( GetView() )
// GetView()->HideSelection();
}
void TextUndoManager::UndoRedoEnd()
{
if ( GetView() )
{
TextSelection aNewSel( GetView()->GetSelection() );
aNewSel.GetStart() = aNewSel.GetEnd();
GetView()->ImpSetSelection( aNewSel );
}
mpTextEngine->UpdateSelections();
mpTextEngine->FormatAndUpdate( GetView() );
}
TextUndo::TextUndo( TextEngine* p )
{
mpTextEngine = p;
}
TextUndo::~TextUndo()
{
}
XubString __EXPORT TextUndo::GetComment() const
{
// return mpTextEngine->GetUndoComment( this );
return String();
}
void TextUndo::SetSelection( const TextSelection& rSel )
{
if ( GetView() )
GetView()->ImpSetSelection( rSel );
}
TextUndoDelPara::TextUndoDelPara( TextEngine* pTextEngine, TextNode* pNode, sal_uLong nPara )
: TextUndo( pTextEngine )
{
mpNode = pNode;
mnPara = nPara;
mbDelObject = sal_True;
}
TextUndoDelPara::~TextUndoDelPara()
{
if ( mbDelObject )
delete mpNode;
}
void __EXPORT TextUndoDelPara::Undo()
{
GetTextEngine()->InsertContent( mpNode, mnPara );
mbDelObject = sal_False; // gehoert wieder der Engine
if ( GetView() )
{
TextSelection aSel( TextPaM( mnPara, 0 ), TextPaM( mnPara, mpNode->GetText().Len() ) );
SetSelection( aSel );
}
}
void __EXPORT TextUndoDelPara::Redo()
{
// pNode stimmt nicht mehr, falls zwischendurch Undos, in denen
// Absaetze verschmolzen sind.
mpNode = GetDoc()->GetNodes().GetObject( mnPara );
delete GetTEParaPortions()->GetObject( mnPara );
GetTEParaPortions()->Remove( mnPara );
// Node nicht loeschen, haengt im Undo!
GetDoc()->GetNodes().Remove( mnPara );
GetTextEngine()->ImpParagraphRemoved( mnPara );
mbDelObject = sal_True; // gehoert wieder dem Undo
sal_uLong nParas = GetDoc()->GetNodes().Count();
sal_uLong n = mnPara < nParas ? mnPara : (nParas-1);
TextNode* pN = GetDoc()->GetNodes().GetObject( n );
TextPaM aPaM( n, pN->GetText().Len() );
SetSelection( aPaM );
}
// -----------------------------------------------------------------------
// TextUndoConnectParas
// ------------------------------------------------------------------------
TextUndoConnectParas::TextUndoConnectParas( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nPos )
: TextUndo( pTextEngine )
{
mnPara = nPara;
mnSepPos = nPos;
}
TextUndoConnectParas::~TextUndoConnectParas()
{
}
void __EXPORT TextUndoConnectParas::Undo()
{
TextPaM aPaM = GetTextEngine()->SplitContent( mnPara, mnSepPos );
SetSelection( aPaM );
}
void __EXPORT TextUndoConnectParas::Redo()
{
TextPaM aPaM = GetTextEngine()->ConnectContents( mnPara );
SetSelection( aPaM );
}
TextUndoSplitPara::TextUndoSplitPara( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nPos )
: TextUndo( pTextEngine )
{
mnPara = nPara;
mnSepPos = nPos;
}
TextUndoSplitPara::~TextUndoSplitPara()
{
}
void __EXPORT TextUndoSplitPara::Undo()
{
TextPaM aPaM = GetTextEngine()->ConnectContents( mnPara );
SetSelection( aPaM );
}
void __EXPORT TextUndoSplitPara::Redo()
{
TextPaM aPaM = GetTextEngine()->SplitContent( mnPara, mnSepPos );
SetSelection( aPaM );
}
TextUndoInsertChars::TextUndoInsertChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const XubString& rStr )
: TextUndo( pTextEngine ),
maTextPaM( rTextPaM ), maText( rStr )
{
}
void __EXPORT TextUndoInsertChars::Undo()
{
TextSelection aSel( maTextPaM, maTextPaM );
aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len();
TextPaM aPaM = GetTextEngine()->ImpDeleteText( aSel );
SetSelection( aPaM );
}
void __EXPORT TextUndoInsertChars::Redo()
{
TextSelection aSel( maTextPaM, maTextPaM );
GetTextEngine()->ImpInsertText( aSel, maText );
TextPaM aNewPaM( maTextPaM );
aNewPaM.GetIndex() = aNewPaM.GetIndex() + maText.Len();
SetSelection( TextSelection( aSel.GetStart(), aNewPaM ) );
}
sal_Bool __EXPORT TextUndoInsertChars::Merge( SfxUndoAction* pNextAction )
{
if ( !pNextAction->ISA( TextUndoInsertChars ) )
return sal_False;
TextUndoInsertChars* pNext = (TextUndoInsertChars*)pNextAction;
if ( maTextPaM.GetPara() != pNext->maTextPaM.GetPara() )
return sal_False;
if ( ( maTextPaM.GetIndex() + maText.Len() ) == pNext->maTextPaM.GetIndex() )
{
maText += pNext->maText;
return sal_True;
}
return sal_False;
}
TextUndoRemoveChars::TextUndoRemoveChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const XubString& rStr )
: TextUndo( pTextEngine ),
maTextPaM( rTextPaM ), maText( rStr )
{
}
void __EXPORT TextUndoRemoveChars::Undo()
{
TextSelection aSel( maTextPaM, maTextPaM );
GetTextEngine()->ImpInsertText( aSel, maText );
aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len();
SetSelection( aSel );
}
void __EXPORT TextUndoRemoveChars::Redo()
{
TextSelection aSel( maTextPaM, maTextPaM );
aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len();
TextPaM aPaM = GetTextEngine()->ImpDeleteText( aSel );
SetSelection( aPaM );
}
TextUndoSetAttribs::TextUndoSetAttribs( TextEngine* pTextEngine, const TextSelection& rSel )
: TextUndo( pTextEngine ), maSelection( rSel )
{
maSelection.Justify();
// aNewAttribs.Set( rNewItems );
// mbSetIsRemove = sal_False;
// mnRemoveWhich = 0;
// mnSpecial = 0;
}
TextUndoSetAttribs::~TextUndoSetAttribs()
{
// ...............
}
void __EXPORT TextUndoSetAttribs::Undo()
{
for ( sal_uLong nPara = maSelection.GetStart().GetPara(); nPara <= maSelection.GetEnd().GetPara(); nPara++ )
{
// ContentAttribsInfo* pInf = aPrevAttribs[ (sal_uInt16)(nPara-aESel.nStartPara) ];
// GetTextEngine()->RemoveCharAttribs( nPara );
// TextNode* pNode = GetTextEngine()->GetTextDoc().GetObject( nPara );
// for ( sal_uInt16 nAttr = 0; nAttr < pInf->GetPrevCharAttribs().Count(); nAttr++ )
// {
// GetTextEngine()->GetTextDoc().InsertAttrib( pNode, pX->GetStart(), pX->GetEnd(), *pX->GetItem() );
// }
}
SetSelection( maSelection );
}
void __EXPORT TextUndoSetAttribs::Redo()
{
// if ( !bSetIsRemove )
// GetTextEngine()->SetAttribs( aSel, aNewAttribs, nSpecial );
// else
// GetTextEngine()->RemoveCharAttribs( aSel, bRemoveParaAttribs, nRemoveWhich );
SetSelection( maSelection );
}