blob: cb2b7ff38ccacdf3f0eb7dbbf470ff0cf810d58a [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_sd.hxx"
#include "undo/undoobjects.hxx"
#include "sdpage.hxx"
#include "CustomAnimationEffect.hxx"
#include "drawdoc.hxx"
#include "undoanim.hxx"
using namespace sd;
///////////////////////////////////////////////////////////////////////
UndoRemovePresObjectImpl::UndoRemovePresObjectImpl( SdrObject& rObject )
: mpUndoUsercall(0)
, mpUndoAnimation(0)
, mpUndoPresObj(0)
{
SdPage* pPage = dynamic_cast< SdPage* >( rObject.GetPage() );
if( pPage )
{
if( pPage->IsPresObj(&rObject) )
mpUndoPresObj = new UndoObjectPresentationKind( rObject );
if( rObject.GetUserCall() )
mpUndoUsercall = new UndoObjectUserCall(rObject);
if( pPage->hasAnimationNode() )
{
com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xShape( rObject.getUnoShape(), com::sun::star::uno::UNO_QUERY );
if( pPage->getMainSequence()->hasEffect( xShape ) )
{
mpUndoAnimation = new UndoAnimation( static_cast< SdDrawDocument* >( pPage->GetModel() ), pPage );
}
}
}
}
//---------------------------------------------------------------------
UndoRemovePresObjectImpl::~UndoRemovePresObjectImpl()
{
delete mpUndoAnimation;
delete mpUndoPresObj;
delete mpUndoUsercall;
}
//---------------------------------------------------------------------
void UndoRemovePresObjectImpl::Undo()
{
if( mpUndoUsercall )
mpUndoUsercall->Undo();
if( mpUndoPresObj )
mpUndoPresObj->Undo();
if( mpUndoAnimation )
mpUndoAnimation->Undo();
}
//---------------------------------------------------------------------
void UndoRemovePresObjectImpl::Redo()
{
if( mpUndoAnimation )
mpUndoAnimation->Redo();
if( mpUndoPresObj )
mpUndoPresObj->Redo();
if( mpUndoUsercall )
mpUndoUsercall->Redo();
}
///////////////////////////////////////////////////////////////////////
UndoRemoveObject::UndoRemoveObject( SdrObject& rObject, bool bOrdNumDirect )
: SdrUndoRemoveObj( rObject, bOrdNumDirect ), UndoRemovePresObjectImpl( rObject )
, mxSdrObject(&rObject)
{
}
//---------------------------------------------------------------------
void UndoRemoveObject::Undo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoRemoveObject::Undo(), object already dead!" );
if( mxSdrObject.is() )
{
SdrUndoRemoveObj::Undo();
UndoRemovePresObjectImpl::Undo();
}
}
//---------------------------------------------------------------------
void UndoRemoveObject::Redo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoRemoveObject::Redo(), object already dead!" );
if( mxSdrObject.is() )
{
UndoRemovePresObjectImpl::Redo();
SdrUndoRemoveObj::Redo();
}
}
///////////////////////////////////////////////////////////////////////
UndoDeleteObject::UndoDeleteObject( SdrObject& rObject, bool bOrdNumDirect )
: SdrUndoDelObj( rObject, bOrdNumDirect )
, UndoRemovePresObjectImpl( rObject )
, mxSdrObject(&rObject)
{
}
//---------------------------------------------------------------------
void UndoDeleteObject::Undo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoDeleteObject::Undo(), object already dead!" );
if( mxSdrObject.is() )
{
SdrUndoDelObj::Undo();
UndoRemovePresObjectImpl::Undo();
}
}
//---------------------------------------------------------------------
void UndoDeleteObject::Redo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoDeleteObject::Redo(), object already dead!" );
if( mxSdrObject.is() )
{
UndoRemovePresObjectImpl::Redo();
SdrUndoDelObj::Redo();
}
}
///////////////////////////////////////////////////////////////////////
UndoReplaceObject::UndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject, bool bOrdNumDirect )
: SdrUndoReplaceObj( rOldObject, rNewObject, bOrdNumDirect )
, UndoRemovePresObjectImpl( rOldObject )
, mxSdrObject( &rOldObject )
{
}
//---------------------------------------------------------------------
void UndoReplaceObject::Undo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoReplaceObject::Undo(), object already dead!" );
if( mxSdrObject.is() )
{
SdrUndoReplaceObj::Undo();
UndoRemovePresObjectImpl::Undo();
}
}
//---------------------------------------------------------------------
void UndoReplaceObject::Redo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoReplaceObject::Redo(), object already dead!" );
if( mxSdrObject.is() )
{
UndoRemovePresObjectImpl::Redo();
SdrUndoReplaceObj::Redo();
}
}
///////////////////////////////////////////////////////////////////////
UndoObjectSetText::UndoObjectSetText( SdrObject& rObject, sal_Int32 nText )
: SdrUndoObjSetText( rObject, nText )
, mpUndoAnimation(0)
, mbNewEmptyPresObj(false)
, mxSdrObject( &rObject )
{
SdPage* pPage = dynamic_cast< SdPage* >( rObject.GetPage() );
if( pPage && pPage->hasAnimationNode() )
{
com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xShape( rObject.getUnoShape(), com::sun::star::uno::UNO_QUERY );
if( pPage->getMainSequence()->hasEffect( xShape ) )
{
mpUndoAnimation = new UndoAnimation( static_cast< SdDrawDocument* >( pPage->GetModel() ), pPage );
}
}
}
//---------------------------------------------------------------------
UndoObjectSetText::~UndoObjectSetText()
{
delete mpUndoAnimation;
}
//---------------------------------------------------------------------
void UndoObjectSetText::Undo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectSetText::Undo(), object already dead!" );
if( mxSdrObject.is() )
{
mbNewEmptyPresObj = mxSdrObject->IsEmptyPresObj() ? true : false;
SdrUndoObjSetText::Undo();
if( mpUndoAnimation )
mpUndoAnimation->Undo();
}
}
//---------------------------------------------------------------------
void UndoObjectSetText::Redo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectSetText::Redo(), object already dead!" );
if( mxSdrObject.is() )
{
if( mpUndoAnimation )
mpUndoAnimation->Redo();
SdrUndoObjSetText::Redo();
mxSdrObject->SetEmptyPresObj(mbNewEmptyPresObj ? sal_True : sal_False );
}
}
//////////////////////////////////////////////////////////////////////////////
// Undo for SdrObject::SetUserCall()
UndoObjectUserCall::UndoObjectUserCall(SdrObject& rObject)
: SdrUndoObj(rObject)
, mpOldUserCall((SdPage*)rObject.GetUserCall())
, mpNewUserCall(0)
, mxSdrObject( &rObject )
{
}
//---------------------------------------------------------------------
void UndoObjectUserCall::Undo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectUserCall::Undo(), object already dead!" );
if( mxSdrObject.is() )
{
mpNewUserCall = mxSdrObject->GetUserCall();
mxSdrObject->SetUserCall(mpOldUserCall);
}
}
//---------------------------------------------------------------------
void UndoObjectUserCall::Redo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectUserCall::Redo(), object already dead!" );
if( mxSdrObject.is() )
{
mxSdrObject->SetUserCall(mpNewUserCall);
}
}
//////////////////////////////////////////////////////////////////////////////
// Undo for SdPage::InsertPresObj() and SdPage::RemovePresObj()
UndoObjectPresentationKind::UndoObjectPresentationKind(SdrObject& rObject)
: SdrUndoObj(rObject)
, meOldKind(PRESOBJ_NONE)
, meNewKind(PRESOBJ_NONE)
, mxPage( rObject.GetPage() )
, mxSdrObject( &rObject )
{
DBG_ASSERT( mxPage.is(), "sd::UndoObjectPresentationKind::UndoObjectPresentationKind(), does not work for shapes without a slide!" );
if( mxPage.is() )
meOldKind = static_cast< SdPage* >( mxPage.get() )->GetPresObjKind( &rObject );
}
//---------------------------------------------------------------------
void UndoObjectPresentationKind::Undo()
{
if( mxPage.is() && mxSdrObject.is() )
{
SdPage* pPage = static_cast< SdPage* >( mxPage.get() );
meNewKind = pPage->GetPresObjKind( mxSdrObject.get() );
if( meNewKind != PRESOBJ_NONE )
pPage->RemovePresObj( mxSdrObject.get() );
if( meOldKind != PRESOBJ_NONE )
pPage->InsertPresObj( mxSdrObject.get(), meOldKind );
}
}
//---------------------------------------------------------------------
void UndoObjectPresentationKind::Redo()
{
if( mxPage.is() && mxSdrObject.is() )
{
SdPage* pPage = static_cast< SdPage* >( mxPage.get() );
if( meOldKind != PRESOBJ_NONE )
pPage->RemovePresObj( mxSdrObject.get() );
if( meNewKind != PRESOBJ_NONE )
pPage->InsertPresObj( mxSdrObject.get(), meNewKind );
}
}
//////////////////////////////////////////////////////////////////////////////
UndoAutoLayoutPosAndSize::UndoAutoLayoutPosAndSize( SdPage& rPage )
: mxPage( &rPage )
{
}
//---------------------------------------------------------------------
void UndoAutoLayoutPosAndSize::Undo()
{
// do nothing
}
//---------------------------------------------------------------------
void UndoAutoLayoutPosAndSize::Redo()
{
SdPage* pPage = static_cast< SdPage* >( mxPage.get() );
if( pPage )
pPage->SetAutoLayout( pPage->GetAutoLayout(), sal_False, sal_False );
}
//////////////////////////////////////////////////////////////////////////////
UndoGeoObject::UndoGeoObject( SdrObject& rNewObj )
: SdrUndoGeoObj( rNewObj )
, mxPage( rNewObj.GetPage() )
, mxSdrObject( &rNewObj )
{
}
//---------------------------------------------------------------------
void UndoGeoObject::Undo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoGeoObject::Undo(), object already dead!" );
if( mxSdrObject.is() )
{
if( mxPage.is() )
{
ScopeLockGuard aGuard( static_cast< SdPage* >( mxPage.get() )->maLockAutoLayoutArrangement );
SdrUndoGeoObj::Undo();
}
else
{
SdrUndoGeoObj::Undo();
}
}
}
//---------------------------------------------------------------------
void UndoGeoObject::Redo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoGeoObject::Redo(), object already dead!" );
if( mxSdrObject.is() )
{
if( mxPage.is() )
{
ScopeLockGuard aGuard( static_cast< SdPage* >(mxPage.get())->maLockAutoLayoutArrangement );
SdrUndoGeoObj::Redo();
}
else
{
SdrUndoGeoObj::Redo();
}
}
}
//---------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////
UndoAttrObject::UndoAttrObject( SdrObject& rObject, bool bStyleSheet1, bool bSaveText )
: SdrUndoAttrObj( rObject, bStyleSheet1 ? sal_True : sal_False, bSaveText ? sal_True : sal_False )
, mxPage( rObject.GetPage() )
, mxSdrObject( &rObject )
{
}
//---------------------------------------------------------------------
void UndoAttrObject::Undo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoAttrObject::Undo(), object already dead!" );
if( mxSdrObject.is() )
{
if( mxPage.is() )
{
ScopeLockGuard aGuard( static_cast< SdPage* >( mxPage.get() )->maLockAutoLayoutArrangement );
SdrUndoAttrObj::Undo();
}
else
{
SdrUndoAttrObj::Undo();
}
}
}
//---------------------------------------------------------------------
void UndoAttrObject::Redo()
{
DBG_ASSERT( mxSdrObject.is(), "sd::UndoAttrObject::Redo(), object already dead!" );
if( mxSdrObject.is() )
{
if( mxPage.is() )
{
ScopeLockGuard aGuard( static_cast< SdPage* >( mxPage.get() )->maLockAutoLayoutArrangement );
SdrUndoAttrObj::Redo();
}
else
{
SdrUndoAttrObj::Redo();
}
}
}