blob: 74aaad235aa38245394544f58584a0335b14c533 [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_sw.hxx"
#include <svx/svdview.hxx>
#include <editsh.hxx>
#include <fesh.hxx>
#include <doc.hxx>
#include <IDocumentUndoRedo.hxx>
#include <pam.hxx>
#include <UndoCore.hxx>
#include <swundo.hxx>
#include <dcontact.hxx>
#include <flyfrm.hxx>
#include <frmfmt.hxx>
#include <viewimp.hxx>
#include <docsh.hxx>
/** helper function to select all objects in an SdrMarkList;
* implementation: see below */
void lcl_SelectSdrMarkList( SwEditShell* pShell,
const SdrMarkList* pSdrMarkList );
bool SwEditShell::CursorsLocked() const
{
return GetDoc()->GetDocShell()->GetModel()->hasControllersLocked();
}
void
SwEditShell::HandleUndoRedoContext(::sw::UndoRedoContext & rContext)
{
// do nothing if somebody has locked controllers!
if (CursorsLocked())
{
return;
}
SwFrmFmt * pSelFmt(0);
SdrMarkList * pMarkList(0);
rContext.GetSelections(pSelFmt, pMarkList);
if (pSelFmt) // select frame
{
if (RES_DRAWFRMFMT == pSelFmt->Which())
{
SdrObject* pSObj = pSelFmt->FindSdrObject();
static_cast<SwFEShell*>(this)->SelectObj(
pSObj->GetCurrentBoundRect().Center() );
}
else
{
Point aPt;
SwFlyFrm *const pFly =
static_cast<SwFlyFrmFmt*>(pSelFmt)->GetFrm(& aPt, false);
if (pFly)
{
static_cast<SwFEShell*>(this)->SelectFlyFrm(*pFly, true);
}
}
}
else if (pMarkList)
{
lcl_SelectSdrMarkList( this, pMarkList );
}
else if (GetCrsr()->GetNext() != GetCrsr())
{
// current cursor is the last one:
// go around the ring, to the first cursor
GoNextCrsr();
}
}
bool SwEditShell::Undo(sal_uInt16 const nCount)
{
SET_CURR_SHELL( this );
// #105332# current undo state was not saved
::sw::UndoGuard const undoGuard(GetDoc()->GetIDocumentUndoRedo());
sal_Bool bRet = sal_False;
StartAllAction();
{
// eigentlich muesste ja nur der aktuelle Cursor berarbeitet
// werden, d.H. falls ein Ring besteht, diesen temporaer aufheben,
// damit nicht bei Einfuge-Operationen innerhalb von Undo
// an allen Bereichen eingefuegt wird.
KillPams();
SetMark(); // Bound1 und Bound2 in den gleichen Node
ClearMark();
SwUndoId nLastUndoId(UNDO_EMPTY);
GetLastUndoInfo(0, & nLastUndoId);
const bool bRestoreCrsr = nCount == 1
&& ( UNDO_AUTOFORMAT == nLastUndoId
|| UNDO_AUTOCORRECT == nLastUndoId
|| UNDO_SETDEFTATTR == nLastUndoId );
Push();
//JP 18.09.97: gesicherten TabellenBoxPtr zerstoeren, eine autom.
// Erkennung darf nur noch fuer die neue "Box" erfolgen!
ClearTblBoxCntnt();
const RedlineMode_t eOld = GetDoc()->GetRedlineMode();
try {
for (sal_uInt16 i = 0; i < nCount; ++i)
{
bRet = GetDoc()->GetIDocumentUndoRedo().Undo()
|| bRet;
}
} catch (::com::sun::star::uno::Exception & e) {
OSL_TRACE("SwEditShell::Undo(): exception caught:\n %s",
::rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8)
.getStr());
}
Pop( !bRestoreCrsr );
GetDoc()->SetRedlineMode( eOld );
GetDoc()->CompressRedlines();
//JP 18.09.97: autom. Erkennung fuer die neue "Box"
SaveTblBoxCntnt();
}
EndAllAction();
return bRet;
}
bool SwEditShell::Redo(sal_uInt16 const nCount)
{
SET_CURR_SHELL( this );
sal_Bool bRet = sal_False;
// #105332# undo state was not saved
::sw::UndoGuard const undoGuard(GetDoc()->GetIDocumentUndoRedo());
StartAllAction();
{
// eigentlich muesste ja nur der aktuelle Cursor berarbeitet
// werden, d.H. falls ein Ring besteht, diesen temporaer aufheben,
// damit nicht bei Einfuge-Operationen innerhalb von Undo
// an allen Bereichen eingefuegt wird.
KillPams();
SetMark(); // Bound1 und Bound2 in den gleichen Node
ClearMark();
SwUndoId nFirstRedoId(UNDO_EMPTY);
GetDoc()->GetIDocumentUndoRedo().GetFirstRedoInfo(0, & nFirstRedoId);
const bool bRestoreCrsr = nCount == 1 && UNDO_SETDEFTATTR == nFirstRedoId;
Push();
//JP 18.09.97: gesicherten TabellenBoxPtr zerstoeren, eine autom.
// Erkennung darf nur noch fuer die neue "Box" erfolgen!
ClearTblBoxCntnt();
RedlineMode_t eOld = GetDoc()->GetRedlineMode();
try {
for (sal_uInt16 i = 0; i < nCount; ++i)
{
bRet = GetDoc()->GetIDocumentUndoRedo().Redo()
|| bRet;
}
} catch (::com::sun::star::uno::Exception & e) {
OSL_TRACE("SwEditShell::Redo(): exception caught:\n %s",
::rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8)
.getStr());
}
Pop( !bRestoreCrsr );
GetDoc()->SetRedlineMode( eOld );
GetDoc()->CompressRedlines();
//JP 18.09.97: autom. Erkennung fuer die neue "Box"
SaveTblBoxCntnt();
}
EndAllAction();
return bRet;
}
bool SwEditShell::Repeat(sal_uInt16 const nCount)
{
SET_CURR_SHELL( this );
sal_Bool bRet = sal_False;
StartAllAction();
try {
::sw::RepeatContext context(*GetDoc(), *GetCrsr());
bRet = GetDoc()->GetIDocumentUndoRedo().Repeat( context, nCount )
|| bRet;
} catch (::com::sun::star::uno::Exception & e) {
OSL_TRACE("SwEditShell::Repeat(): exception caught:\n %s",
::rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8)
.getStr());
}
EndAllAction();
return bRet;
}
void lcl_SelectSdrMarkList( SwEditShell* pShell,
const SdrMarkList* pSdrMarkList )
{
ASSERT( pShell != NULL, "need shell!" );
ASSERT( pSdrMarkList != NULL, "need mark list" );
if( pShell->ISA( SwFEShell ) )
{
SwFEShell* pFEShell = static_cast<SwFEShell*>( pShell );
bool bFirst = true;
for( sal_uInt16 i = 0; i < pSdrMarkList->GetMarkCount(); ++i )
{
SdrObject *pObj = pSdrMarkList->GetMark( i )->GetMarkedSdrObj();
if( pObj )
{
pFEShell->SelectObj( Point(), bFirst ? 0 : SW_ADD_SELECT, pObj );
bFirst = false;
}
}
// the old implementation would always unselect
// objects, even if no new ones were selected. If this
// is a problem, we need to re-work this a little.
ASSERT( pSdrMarkList->GetMarkCount() != 0, "empty mark list" );
}
}