2000-09-18 23:08:29 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 15:05:35 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 15:05:35 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 15:05:35 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 15:05:35 +00:00
|
|
|
* $RCSfile: undel.cxx,v $
|
2008-06-13 09:27:43 +00:00
|
|
|
* $Revision: 1.27 $
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 15:05:35 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 15:05:35 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 15:05:35 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 15:05:35 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-16 20:50:48 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_sw.hxx"
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
#include <hintids.hxx>
|
2000-10-25 14:13:25 +00:00
|
|
|
#include <unotools/charclass.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <svx/brkitem.hxx>
|
|
|
|
#include <fmtpdsc.hxx>
|
|
|
|
#include <frmfmt.hxx>
|
2006-03-31 08:52:16 +00:00
|
|
|
#include <fmtanchr.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <doc.hxx>
|
|
|
|
#include <swtable.hxx>
|
|
|
|
#include <swundo.hxx> // fuer die UndoIds
|
|
|
|
#include <pam.hxx>
|
|
|
|
#include <ndtxt.hxx>
|
|
|
|
#include <undobj.hxx>
|
|
|
|
#include <rolbck.hxx>
|
|
|
|
#include <poolfmt.hxx>
|
|
|
|
#include <mvsave.hxx>
|
|
|
|
#include <redline.hxx>
|
|
|
|
#include <docary.hxx>
|
2004-05-25 14:19:25 +00:00
|
|
|
#include <sfx2/app.hxx>
|
2004-09-08 13:59:07 +00:00
|
|
|
|
|
|
|
#include <fldbas.hxx>
|
|
|
|
#include <fmtfld.hxx>
|
2004-05-18 13:07:16 +00:00
|
|
|
#include <comcore.hrc> // #111827#
|
|
|
|
#include <undo.hrc>
|
2004-09-08 13:59:07 +00:00
|
|
|
|
2004-05-18 13:07:16 +00:00
|
|
|
// #include <svx/svxacorr.hxx>
|
|
|
|
// #include <comphelper/processfactory.hxx>
|
|
|
|
// #include <svx/unolingu.hxx>
|
|
|
|
// #include <unotools/localedatawrapper.hxx>
|
|
|
|
|
|
|
|
// using namespace comphelper;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
inline SwDoc& SwUndoIter::GetDoc() const { return *pAktPam->GetDoc(); }
|
|
|
|
|
|
|
|
|
|
|
|
// DELETE
|
2006-03-31 08:52:16 +00:00
|
|
|
/* lcl_MakeAutoFrms has to call MakeFrms for objects bounded "AtChar" ( == AUTO ),
|
|
|
|
if the anchor frame has be moved via _MoveNodes(..) and DelFrms(..)
|
|
|
|
*/
|
|
|
|
|
|
|
|
void lcl_MakeAutoFrms( const SwSpzFrmFmts& rSpzArr, ULONG nMovedIndex )
|
|
|
|
{
|
|
|
|
if( rSpzArr.Count() )
|
|
|
|
{
|
|
|
|
SwFlyFrmFmt* pFmt;
|
|
|
|
const SwFmtAnchor* pAnchor;
|
|
|
|
for( USHORT n = 0; n < rSpzArr.Count(); ++n )
|
|
|
|
{
|
|
|
|
pFmt = (SwFlyFrmFmt*)rSpzArr[n];
|
|
|
|
pAnchor = &pFmt->GetAnchor();
|
|
|
|
if( pAnchor->GetAnchorId() == FLY_AUTO_CNTNT )
|
|
|
|
{
|
|
|
|
const SwPosition* pAPos = pAnchor->GetCntntAnchor();
|
|
|
|
if( pAPos && nMovedIndex == pAPos->nNode.GetIndex() )
|
|
|
|
pFmt->MakeFrms();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
SwUndoDelete has to perform a deletion and to record anything that is needed to restore the
|
|
|
|
situation before the deletion. Unfortunately a part of the deletion will be done after calling
|
|
|
|
this Ctor, this has to be kept in mind! In this Ctor only the complete paragraphs will be deleted,
|
|
|
|
the joining of the first and last paragraph of the selection will be handled outside this function.
|
|
|
|
Here are the main steps of the function:
|
|
|
|
1. Deletion/recording of content indizes of the selection: footnotes, fly frames and bookmarks
|
|
|
|
Step 1 could shift all nodes by deletion of footnotes => nNdDiff will be set.
|
|
|
|
2. If the paragraph where the selection ends, is the last content of a section so that this
|
|
|
|
section becomes empty when the paragraphs will be joined we have to do some smart actions ;-)
|
|
|
|
The paragraph will be moved outside the section and replaced by a dummy text node, the complete
|
|
|
|
section will be deleted in step 3. The difference between replacement dummy and original is
|
|
|
|
nReplacementDummy.
|
|
|
|
3. Moving complete selected nodes into the UndoArray. Before this happens the selection has to be
|
|
|
|
extended if there are sections which would become empty otherwise. BTW: sections will be moved into
|
|
|
|
the UndoArray if they are complete part of the selection. Sections starting or ending outside of the
|
|
|
|
selection will not be removed from the DocNodeArray even they got a "dummy"-copy in the UndoArray.
|
|
|
|
4. We have to anticipate the joining of the two paragraphs if the start paragraph is inside a
|
|
|
|
section and the end paragraph not. Then we have to move the paragraph into this section and to
|
|
|
|
record this in nSectDiff.
|
|
|
|
*/
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-07-13 10:31:46 +00:00
|
|
|
SwUndoDelete::SwUndoDelete( SwPaM& rPam, BOOL bFullPara, BOOL bCalledByTblCpy )
|
2000-09-18 23:08:29 +00:00
|
|
|
: SwUndo(UNDO_DELETE), SwUndRng( rPam ),
|
2006-03-31 08:52:16 +00:00
|
|
|
pMvStt( 0 ), pSttStr(0), pEndStr(0), pRedlData(0), pRedlSaveData(0),
|
|
|
|
nNode(0), nNdDiff(0), nSectDiff(0), nReplaceDummy(0), nSetPos(0),
|
|
|
|
bGroup( FALSE ), bBackSp( FALSE ), bJoinNext( FALSE ), bTblDelLastNd( FALSE ),
|
2006-07-13 10:31:46 +00:00
|
|
|
bDelFullPara( bFullPara ), bResetPgDesc( FALSE ), bResetPgBrk( FALSE ),
|
|
|
|
bFromTableCopy( bCalledByTblCpy )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
bDelFullPara = bFullPara; // This is set e.g. if an empty paragraph before a table is deleted
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2004-09-08 13:59:07 +00:00
|
|
|
bCacheComment = false;
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
SwDoc * pDoc = rPam.GetDoc();
|
|
|
|
|
|
|
|
if( !pDoc->IsIgnoreRedline() && pDoc->GetRedlineTbl().Count() )
|
|
|
|
{
|
|
|
|
pRedlSaveData = new SwRedlineSaveDatas;
|
|
|
|
if( !FillSaveData( rPam, *pRedlSaveData ))
|
|
|
|
delete pRedlSaveData, pRedlSaveData = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !pHistory )
|
|
|
|
pHistory = new SwHistory;
|
|
|
|
|
|
|
|
// loesche erstmal alle Fussnoten
|
|
|
|
const SwPosition *pStt = rPam.Start(),
|
|
|
|
*pEnd = rPam.GetPoint() == pStt
|
|
|
|
? rPam.GetMark()
|
|
|
|
: rPam.GetPoint();
|
|
|
|
|
2006-03-31 08:52:16 +00:00
|
|
|
// Step 1. deletion/record of content indizes
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bDelFullPara )
|
|
|
|
{
|
|
|
|
ASSERT( rPam.HasMark(), "PaM ohne Mark" );
|
|
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint(),
|
2007-09-27 08:30:29 +00:00
|
|
|
DelCntntType(nsDelCntntType::DELCNT_ALL | nsDelCntntType::DELCNT_CHKNOCNTNT) );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
BOOL bDoesUndo = pDoc->DoesUndo();
|
|
|
|
pDoc->DoUndo( FALSE );
|
CWS-TOOLING: integrate CWS swrefactormarks2
2009-04-09 12:51:41 +0200 b_michaelsen r270689 : #i94949# cleaned up assertions after rebasing
2009-04-08 17:37:08 +0200 b_michaelsen r270658 : fixing sw/source/ui/utlui/makefile.mk
2009-04-07 17:56:54 +0200 b_michaelsen r270606 : added bookctrl.cxx to EXCEPTIONFILES, because this is needed for stl on unxsols4
2009-04-07 17:05:20 +0200 b_michaelsen r270603 : added crbm.cxx to EXCEPTIONFILES, because this is needed for stl on unxsols4
2009-04-02 23:44:38 +0200 b_michaelsen r270436 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@270033 (milestone: DEV300:m45)
2009-02-27 16:25:31 +0100 b_michaelsen r268606 : #i94949# fixed Windows buildbreaker
2009-02-25 18:01:13 +0100 b_michaelsen r268464 : #i94949# Bookmarktest document filter roundtrips
2009-02-24 18:23:55 +0100 b_michaelsen r268404 : #i94949# Bookmark unittests
2009-02-23 19:47:44 +0100 b_michaelsen r268370 : #i94949# added unittest for bookmarks
2009-02-23 12:22:07 +0100 b_michaelsen r268348 : #i94949# fixing CheckCrossReferences testcase
2009-02-20 18:12:50 +0100 b_michaelsen r268335 : #i94949# fixing SwXTextRange
2009-02-18 18:32:57 +0100 b_michaelsen r268252 : #i94949# deregistering DdeBookmarks on delete
2009-02-18 18:29:08 +0100 b_michaelsen r268251 : fixing dbgoutsw.cxx for debug builds
2009-02-16 18:42:43 +0100 b_michaelsen r267834 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@267171 (milestone: DEV300:m41)
2009-02-12 15:32:02 +0100 b_michaelsen r267667 : #i94949 fixed crossrefbookmark naming
2009-02-11 18:30:08 +0100 b_michaelsen r267624 : #94949# fixing bookmark navigation
2009-02-11 13:55:26 +0100 b_michaelsen r267599 : #i94949# fixed bookmark naming
2009-02-10 17:53:05 +0100 b_michaelsen r267571 : #i94949# renamed HasOtherMarkPos to IsExpanded
2009-02-10 17:23:01 +0100 b_michaelsen r267564 : #i94949# renamed ::sw::bookmark namespace to more fitting ::sw::mark
2009-02-10 16:16:32 +0100 b_michaelsen r267553 : #i94949# creating only CrossRefBookmark per Txtnode
2009-02-10 12:14:05 +0100 b_michaelsen r267547 : #i94949# fixed bookmark count in navigator
2009-02-09 19:12:18 +0100 b_michaelsen r267532 : #i94949# lcl_CopyBookmarks(..) - handle marks on boundaries correctly
2009-02-09 17:32:45 +0100 b_michaelsen r267524 : #i94949# setting the refobject of the DdeBookmark in Sin SwServerObject::SetDdeBookmark(..)
2009-02-09 17:22:15 +0100 b_michaelsen r267523 : #i94949# trying to harden SwServerObject
2009-02-09 16:47:32 +0100 b_michaelsen r267521 : #i94949# lcl_CopyBookmarks(..): try to get the source mark name, if possible
2009-02-09 16:05:42 +0100 b_michaelsen r267519 : #i94949# clearing the OtherMarkPos if PaM has no mark in repositionMark(..), swapping inverted bookmarks without hissing an assertion
2009-02-09 15:55:38 +0100 b_michaelsen r267518 : #i94949# checking for out-of-bounds in SwView::ExecuteStatusLine(..)
2009-02-09 15:23:47 +0100 b_michaelsen r267517 : #i94949# using an UNO_BOOKMARK in ui/dbui/dbinsdlg.cxx
2009-02-09 14:14:47 +0100 b_michaelsen r267514 : #i94949# IDocumentMarkAccess::GetType(..) asserts on unknown type
2009-02-09 14:04:25 +0100 b_michaelsen r267513 : #i94949# using rtl strings instead of tools-strings in CrossRefBookmarks
2009-02-09 13:55:01 +0100 b_michaelsen r267510 : #i94949# using empty string for UnoMark construction
2009-02-09 13:46:46 +0100 b_michaelsen r267509 : #i94949# removed superfluous #includes, removed superfluous member DdeBookmark::bGenerateName, initialized DdeBookmark::m_aRefObj removed superfluous local _FindItem::ClearObj
2009-02-06 14:38:37 +0100 b_michaelsen r267462 : #i94949# fixing FN_STAT_BOOKMARK dispatches
2009-02-05 18:05:07 +0100 b_michaelsen r267436 : #i94949# removing superfluous #includes
2009-02-04 15:51:31 +0100 b_michaelsen r267391 : fixing resync merge error
2009-02-02 19:39:55 +0100 b_michaelsen r267294 : #i94949# bookmark performance
2009-01-30 19:30:51 +0100 b_michaelsen r267229 : #i94949# throwing IllegalArgumentException, if appropriate
2009-01-30 19:29:56 +0100 b_michaelsen r267228 : #i94949# refactored lcl_FillBookmarkArray, comments, constness
2009-01-30 19:23:49 +0100 b_michaelsen r267227 : #i94949# refactored lcl_FillBookmarkArray, comments, constness
2009-01-30 19:16:06 +0100 b_michaelsen r267226 : #i94949# refactored lcl_FillBookmarkArray
2009-01-30 17:59:27 +0100 b_michaelsen r267222 : #i94949# removed superficial #include
2009-01-30 17:50:02 +0100 b_michaelsen r267220 : #i94949# SwXTextRange remembers its UNO bookmark
2009-01-29 20:19:58 +0100 b_michaelsen r267168 : #i94949# implemented IDocumentMarkAccess::findBookmark
2009-01-29 17:22:17 +0100 b_michaelsen r267162 : #i94949# implemented renameMark in Markmanager
2009-01-29 14:17:10 +0100 b_michaelsen r267134 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:21:54 +0100 b_michaelsen r267125 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:06:10 +0100 b_michaelsen r267120 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:00:09 +0100 b_michaelsen r267118 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 10:35:10 +0100 b_michaelsen r267101 : #i94949# renamed SetCrsrToBkmk to SetCrsrToMark, moving to start/end of doc if no more bookmarks can be found
2009-01-28 17:05:36 +0100 b_michaelsen r267070 : #i94949# fixed order in aProvNamesId in unocoll.cxx
2009-01-28 15:46:13 +0100 b_michaelsen r267063 : #i94949# documentation
2009-01-28 15:36:59 +0100 b_michaelsen r267062 : #i94949# removing superficial #include
2009-01-28 15:30:36 +0100 b_michaelsen r267061 : #i94949# basic code conventions
2009-01-28 11:14:30 +0100 b_michaelsen r267039 : #i94949# comparing to the actual name of the new mark
2009-01-26 15:22:25 +0100 b_michaelsen r266927 : #i94949# performance fixes
2009-01-14 21:16:56 +0100 b_michaelsen r266332 : #i94949# fixing linux x86-64 compiler warnings
2009-01-14 19:52:06 +0100 b_michaelsen r266331 : #i94949# fixing some compiler warnings
2008-12-15 13:04:49 +0100 b_michaelsen r265474 : #i94949# fixed microsoft compiler warnings
2008-12-12 18:26:02 +0100 b_michaelsen r265434 : #i94949# fixed pro platform buildbreakers
2008-12-11 17:51:24 +0100 b_michaelsen r265342 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@264807 (milestone: DEV300:m37)
2008-12-09 18:30:59 +0100 b_michaelsen r265134 : #i94949# fixed IDocumentMarkAccess::GetType for new mark inheritance tree
2008-12-09 16:56:26 +0100 b_michaelsen r265118 : #i94949# fixed deleteMark optimization
2008-12-09 14:55:58 +0100 b_michaelsen r265092 : #i94949# DdeLink and DdeBookmark
2008-12-05 18:28:05 +0100 b_michaelsen r264914 : #i94949# fixed InitDoc in bookmarks
2008-12-02 02:23:51 +0100 b_michaelsen r264649 : #i94949# removed obsolete naming proposal code in SwXTextRange, fixed navigator reminders to forget the oldest reminder when the pool is empty
2008-12-02 02:05:19 +0100 b_michaelsen r264648 : #i94949# using bisect search for delete
2008-12-02 01:58:16 +0100 b_michaelsen r264647 : #i94949# using bisect search for delete
2008-12-02 01:37:33 +0100 b_michaelsen r264646 : #i94949# using bisect search for delete
2008-12-02 01:03:29 +0100 b_michaelsen r264645 : #i94949# fixed deleteMark crash
2008-12-01 20:55:00 +0100 b_michaelsen r264638 : #i94949# removed crossrefs from ui enumerations
2008-12-01 15:48:12 +0100 b_michaelsen r264613 : #i94949# removed superfluous local functions
2008-12-01 15:01:19 +0100 b_michaelsen r264608 : #i94949# optimized insertion of new marks
2008-12-01 14:33:21 +0100 b_michaelsen r264603 : #i94949# simplified code finding Fieldmark for a position
2008-12-01 14:05:55 +0100 b_michaelsen r264598 : #i94949# fixed reverse travelling through marks, removed obsolete getUniqueMarkName()
2008-11-27 18:48:15 +0100 b_michaelsen r264515 : #i94949# fixed _SaveCntntIdx and friends
2008-11-27 15:59:49 +0100 b_michaelsen r264500 : #i94949# fix Mark position only in ctor
2008-11-27 15:52:28 +0100 b_michaelsen r264497 : #i94949# fixed Bug in SwXBookmark, was using pDoc too early
2008-11-26 14:54:22 +0100 b_michaelsen r264396 : #i94949# fixed documentation, simplified navigator reminder code
2008-11-24 20:45:51 +0100 b_michaelsen r264266 : #i94949# removed last obsolete getUniqueMarkName calls
2008-11-24 20:21:35 +0100 b_michaelsen r264265 : #i94949# fixed typo in IDocumentMarkAccess, removed obsolete getUniqueMarkName calls
2008-11-24 18:34:32 +0100 b_michaelsen r264264 : #i94949# repositioning of Marks, removed possibility to delete marks by name in the core, refactoring of navigator reminder generation
2008-11-21 14:08:49 +0100 b_michaelsen r264137 : #i94949# simplified makeMark
2008-11-21 12:07:09 +0100 b_michaelsen r264120 : #i94949# moved ShortName and KeyCode from IMark to IBookmark
2008-11-19 12:50:49 +0100 b_michaelsen r263981 : #i94949# starting refactoring of bookmark naming
2008-11-19 11:31:08 +0100 b_michaelsen r263972 : #i94949# getting rid of obsolete dynamic casts
2008-11-18 19:06:09 +0100 b_michaelsen r263795 : #i94949# getting rid of index based mark access, IDocumentMarkAccess already provides iterators
2008-11-18 17:50:18 +0100 b_michaelsen r263792 : #i94949# getting rid of index based mark access, IDocumentMarkAccess already provides iterators
2008-11-18 16:48:20 +0100 b_michaelsen r263783 : #i94949# removed methods from crsrsh which are already available directly via IDocumentMarkAccess
2008-11-18 11:31:35 +0100 b_michaelsen r263753 : #i94949# cleaning up mark code in crsrsh
2008-11-17 10:15:25 +0100 b_michaelsen r263705 : #i94949# removed possible integer overflow
2008-11-14 18:48:45 +0100 b_michaelsen r263695 : #i94949# management of mark names in MarkManager
2008-11-14 18:23:40 +0100 b_michaelsen r263693 : #i94949# using polymorphism to do mark-specific setup in SwDoc
2008-11-14 16:27:09 +0100 b_michaelsen r263684 : #i94949# got rid of makeCrossRefBookmark
2008-11-14 13:03:32 +0100 b_michaelsen r263674 : #i94949# refactored Correction methods
2008-11-13 12:27:55 +0100 b_michaelsen r263631 : #i94949# got rid of old-style tools assertions in new code
2008-11-12 16:58:16 +0100 b_michaelsen r263608 : #i94949# added assertion for unique names
2008-11-12 16:55:18 +0100 b_michaelsen r263607 : #i94949# maked XFormField deprecated
2008-11-12 13:04:29 +0100 b_michaelsen r263587 : #i94949# replaced IDocumentMarkAccess::GetType with simple dynamic_cast where possible
2008-11-11 18:45:53 +0100 b_michaelsen r263572 : #i94949# cleaned up SwHstryBookmark
2008-11-11 13:48:18 +0100 b_michaelsen r263557 : #i94949# removed dynamic_casts to SwModify by inheriting IMark from it
2008-11-11 11:26:28 +0100 b_michaelsen r263548 : #i94949# fixed SwXBookmark
2008-11-10 17:01:19 +0100 b_michaelsen r263529 : #i94949# fixed DdeBookmarks in clipboard
2008-11-10 16:44:52 +0100 b_michaelsen r263527 : #i94949# formatting
2008-11-10 16:29:16 +0100 b_michaelsen r263526 : #i94949# fixing unoobj.cxx
2008-11-10 16:23:50 +0100 b_michaelsen r263525 : #i94949# cleaning up crossrefbookmark.cxx/.hxx
2008-11-10 16:02:08 +0100 b_michaelsen r263524 : #i94949# Pdf Export should only generate 'real' bookmarks
2008-11-10 15:33:58 +0100 b_michaelsen r263521 : #i94949# removed const_casts
2008-11-10 15:12:06 +0100 b_michaelsen r263520 : #i94949# moved _DelBookmarks into MarksManager
2008-11-07 18:48:38 +0100 b_michaelsen r263480 : #i94949# using iterator interface
2008-11-07 18:41:46 +0100 b_michaelsen r263478 : #i94949# using iterator interface
2008-11-07 18:07:41 +0100 b_michaelsen r263477 : #i94949# using iterator interface
2008-11-07 17:54:41 +0100 b_michaelsen r263476 : #i94949# using iterator interface
2008-11-07 17:44:41 +0100 b_michaelsen r263475 : #i94949# moved correction methods into MarkManager
2008-11-06 18:47:28 +0100 b_michaelsen r263404 : #i94949# getting rid of superfluous const_casts
2008-11-06 17:58:01 +0100 b_michaelsen r263403 : #i94949# no more setting of mark positions outside of the core
2008-11-06 17:08:37 +0100 b_michaelsen r263401 : #i94949# removed setters from IMark
2008-11-06 13:55:25 +0100 b_michaelsen r263383 : #i94949 SwDoc does not implement IDocumentMarkAccess anymore
2008-11-04 18:17:03 +0100 b_michaelsen r263333 : #i94949# began removing IDocumentMarkAccess from SwDoc
2008-11-04 16:48:34 +0100 b_michaelsen r263330 : removing dead code (SwBitArray) found by mst
2008-11-04 16:29:32 +0100 b_michaelsen r263329 : removing dead code (SwBitArray) found by mst
2008-11-04 14:57:48 +0100 b_michaelsen r263326 : removing dead code (SwBitArray) found by mst
2008-11-04 14:50:18 +0100 b_michaelsen r263325 : #i94949# stricter typing in IDocumentMarkAccess
2008-10-24 15:16:27 +0200 b_michaelsen r262647 : #i94949# renamed ::sw::bookmark::SimpleMark to NavigatorReminder to fit the IDocumentMarkAccess enum
2008-10-24 15:10:10 +0200 b_michaelsen r262646 : #i94949# only 'real' bookmark implement IBookmark, Marks also get removed from m_vFieldmarks on delete/clear
2008-10-24 13:06:23 +0200 b_michaelsen r262636 : #i94949# Fieldmark tabnavigation
2008-10-23 12:16:36 +0200 b_michaelsen r262619 : #i94949# Fieldmark classes and filters
2008-10-22 13:17:18 +0200 b_michaelsen r262597 : #i94949# writer import fixes
2008-10-21 11:30:38 +0200 b_michaelsen r262565 : #i94949# renamed methods containing Bookmark in the generic IMark interface
2008-10-20 14:09:02 +0200 b_michaelsen r262318 : #i94949# fixed SwDoc::CorrRel
2008-10-16 22:45:13 +0200 b_michaelsen r262273 : #i94949 simplified Before/After methods
2008-10-16 21:40:57 +0200 b_michaelsen r262271 : #i94949 renamed SimpleMark to NavigatorReminder
2008-10-16 21:15:23 +0200 b_michaelsen r262270 : #i94949 using shared_ptr only in MarkManager
2008-10-16 17:46:37 +0200 b_michaelsen r262269 : #i94949# getFieldmarkBefore and getFieldmarkAfter
2008-10-16 17:12:13 +0200 b_michaelsen r262265 : #i94949# cleanup in crbm.cxx
2008-10-16 12:49:01 +0200 b_michaelsen r262257 : #i94949# fixed usage of invalid iterator, fixed invalid cast
2008-10-15 15:34:20 +0200 b_michaelsen r262239 : #i94949# added moved files
2008-10-15 15:26:45 +0200 b_michaelsen r262237 : #i94949# initial reimplementation of Bookmarks
2009-04-21 15:40:02 +00:00
|
|
|
_DelBookmarks(pStt->nNode, pEnd->nNode);
|
2000-09-18 23:08:29 +00:00
|
|
|
pDoc->DoUndo( bDoesUndo );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint() );
|
2004-11-09 12:49:37 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
nSetPos = pHistory ? pHistory->Count() : 0;
|
|
|
|
|
|
|
|
// wurde schon was geloescht ??
|
|
|
|
nNdDiff = nSttNode - pStt->nNode.GetIndex();
|
|
|
|
|
|
|
|
bJoinNext = !bFullPara && pEnd == rPam.GetPoint();
|
|
|
|
bBackSp = !bFullPara && !bJoinNext;
|
|
|
|
|
|
|
|
SwTxtNode *pSttTxtNd = 0, *pEndTxtNd = 0;
|
|
|
|
if( !bFullPara )
|
|
|
|
{
|
|
|
|
pSttTxtNd = pStt->nNode.GetNode().GetTxtNode();
|
|
|
|
pEndTxtNd = nSttNode == nEndNode
|
|
|
|
? pSttTxtNd
|
2001-09-27 12:26:40 +00:00
|
|
|
: pEnd->nNode.GetNode().GetTxtNode();
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL bMoveNds = *pStt == *pEnd // noch ein Bereich vorhanden ??
|
|
|
|
? FALSE
|
2006-07-13 10:31:46 +00:00
|
|
|
: ( SaveCntnt( pStt, pEnd, pSttTxtNd, pEndTxtNd ) || bFromTableCopy );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( pSttTxtNd && pEndTxtNd && pSttTxtNd != pEndTxtNd )
|
|
|
|
{
|
|
|
|
// zwei unterschiedliche TextNodes, also speicher noch die
|
|
|
|
// TextFormatCollection fuers
|
|
|
|
pHistory->Add( pSttTxtNd->GetTxtColl(),pStt->nNode.GetIndex(), ND_TEXTNODE );
|
|
|
|
pHistory->Add( pEndTxtNd->GetTxtColl(),pEnd->nNode.GetIndex(), ND_TEXTNODE );
|
|
|
|
|
|
|
|
if( !bJoinNext ) // Selection von Unten nach Oben
|
|
|
|
{
|
|
|
|
// Beim JoinPrev() werden die AUTO-PageBreak's richtig
|
|
|
|
// kopiert. Um diese beim Undo wieder herzustellen, muss das
|
|
|
|
// Auto-PageBreak aus dem EndNode zurueckgesetzt werden.
|
|
|
|
// - fuer die PageDesc, ColBreak dito !
|
2006-12-01 14:48:41 +00:00
|
|
|
if( pEndTxtNd->HasSwAttrSet() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwRegHistory aRegHist( *pEndTxtNd, pHistory );
|
|
|
|
if( SFX_ITEM_SET == pEndTxtNd->GetpSwAttrSet()->GetItemState(
|
|
|
|
RES_BREAK, FALSE ) )
|
|
|
|
pEndTxtNd->ResetAttr( RES_BREAK );
|
2006-12-01 14:48:41 +00:00
|
|
|
if( pEndTxtNd->HasSwAttrSet() &&
|
2000-09-18 23:08:29 +00:00
|
|
|
SFX_ITEM_SET == pEndTxtNd->GetpSwAttrSet()->GetItemState(
|
|
|
|
RES_PAGEDESC, FALSE ) )
|
|
|
|
pEndTxtNd->ResetAttr( RES_PAGEDESC );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// verschiebe jetzt noch den PaM !!!
|
|
|
|
// der SPoint steht am Anfang der SSelection
|
2007-11-07 11:19:11 +00:00
|
|
|
if( pEnd == rPam.GetPoint() && ( !bFullPara || pSttTxtNd || pEndTxtNd ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
rPam.Exchange();
|
|
|
|
|
|
|
|
if( !pSttTxtNd && !pEndTxtNd )
|
|
|
|
rPam.GetPoint()->nNode--;
|
|
|
|
rPam.DeleteMark(); // der SPoint ist aus dem Bereich
|
|
|
|
|
|
|
|
if( !pEndTxtNd )
|
|
|
|
nEndCntnt = 0;
|
|
|
|
if( !pSttTxtNd )
|
|
|
|
nSttCntnt = 0;
|
|
|
|
|
|
|
|
if( bMoveNds ) // sind noch Nodes zu verschieben ?
|
|
|
|
{
|
|
|
|
SwNodes& rNds = (SwNodes&)*pDoc->GetUndoNds();
|
|
|
|
SwNodes& rDocNds = pDoc->GetNodes();
|
2006-03-31 08:52:16 +00:00
|
|
|
SwNodeRange aRg( rDocNds, nSttNode - nNdDiff,
|
|
|
|
rDocNds, nEndNode - nNdDiff );
|
|
|
|
if( !bFullPara && !pEndTxtNd &&
|
|
|
|
&aRg.aEnd.GetNode() != &pDoc->GetNodes().GetEndOfContent() )
|
2006-07-13 10:31:46 +00:00
|
|
|
{
|
2006-08-14 15:49:20 +00:00
|
|
|
SwNode* pNode = aRg.aEnd.GetNode().StartOfSectionNode();
|
2006-07-13 10:31:46 +00:00
|
|
|
if( pNode->GetIndex() >= nSttNode - nNdDiff )
|
|
|
|
aRg.aEnd++; // Deletion of a complete table
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
SwNode* pTmpNd;
|
2006-03-31 08:52:16 +00:00
|
|
|
// Step 2: Expand selection if necessary
|
|
|
|
if( bJoinNext || bFullPara )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
// If all content of a section will be moved into Undo,
|
|
|
|
// the section itself should be moved complete.
|
|
|
|
while( aRg.aEnd.GetIndex() + 2 < rDocNds.Count() &&
|
|
|
|
( (pTmpNd = rDocNds[ aRg.aEnd.GetIndex()+1 ])->IsEndNode() &&
|
2006-08-14 15:49:20 +00:00
|
|
|
pTmpNd->StartOfSectionNode()->IsSectionNode() &&
|
|
|
|
pTmpNd->StartOfSectionNode()->GetIndex() >= aRg.aStart.GetIndex() ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
aRg.aEnd++;
|
2006-03-31 08:52:16 +00:00
|
|
|
nReplaceDummy = aRg.aEnd.GetIndex() + nNdDiff - nEndNode;
|
|
|
|
if( nReplaceDummy )
|
|
|
|
{ // The selection has been expanded, because
|
|
|
|
aRg.aEnd++;
|
|
|
|
if( pEndTxtNd )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
// The end text node has to leave the (expanded) selection
|
|
|
|
// The dummy is needed because _MoveNodes deletes empty sections
|
|
|
|
++nReplaceDummy;
|
|
|
|
SwNodeRange aMvRg( *pEndTxtNd, 0, *pEndTxtNd, 1 );
|
|
|
|
SwPosition aSplitPos( *pEndTxtNd );
|
|
|
|
BOOL bDoesUndo = pDoc->DoesUndo();
|
|
|
|
pDoc->DoUndo( FALSE );
|
2006-08-14 15:49:20 +00:00
|
|
|
pDoc->SplitNode( aSplitPos, false );
|
2006-03-31 08:52:16 +00:00
|
|
|
rDocNds._MoveNodes( aMvRg, rDocNds, aRg.aEnd, TRUE );
|
|
|
|
pDoc->DoUndo( bDoesUndo );
|
|
|
|
aRg.aEnd--;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2006-03-31 08:52:16 +00:00
|
|
|
else
|
|
|
|
nReplaceDummy = 0;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2006-03-31 08:52:16 +00:00
|
|
|
}
|
|
|
|
if( bBackSp || bFullPara )
|
|
|
|
{
|
|
|
|
//See above, the selection has to expanded if there are "nearly empty" sections
|
|
|
|
// and a replacement dummy has to be set if needed.
|
2000-09-18 23:08:29 +00:00
|
|
|
while( 1 < aRg.aStart.GetIndex() &&
|
|
|
|
( (pTmpNd = rDocNds[ aRg.aStart.GetIndex()-1 ])->IsSectionNode() &&
|
2006-03-31 08:52:16 +00:00
|
|
|
pTmpNd->EndOfSectionIndex() < aRg.aEnd.GetIndex() ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
aRg.aStart--;
|
2006-03-31 08:52:16 +00:00
|
|
|
if( pSttTxtNd )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
nReplaceDummy = nSttNode - nNdDiff - aRg.aStart.GetIndex();
|
|
|
|
if( nReplaceDummy )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
SwNodeRange aMvRg( *pSttTxtNd, 0, *pSttTxtNd, 1 );
|
|
|
|
SwPosition aSplitPos( *pSttTxtNd );
|
|
|
|
BOOL bDoesUndo = pDoc->DoesUndo();
|
|
|
|
pDoc->DoUndo( FALSE );
|
2006-08-14 15:49:20 +00:00
|
|
|
pDoc->SplitNode( aSplitPos, false );
|
2006-03-31 08:52:16 +00:00
|
|
|
rDocNds._MoveNodes( aMvRg, rDocNds, aRg.aStart, TRUE );
|
|
|
|
pDoc->DoUndo( bDoesUndo );
|
|
|
|
aRg.aStart--;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2006-07-13 10:31:46 +00:00
|
|
|
|
|
|
|
if( bFromTableCopy )
|
|
|
|
{
|
|
|
|
if( !pEndTxtNd )
|
|
|
|
{
|
|
|
|
if( pSttTxtNd )
|
|
|
|
aRg.aStart++;
|
|
|
|
else if( !bFullPara && !aRg.aEnd.GetNode().IsCntntNode() )
|
|
|
|
aRg.aEnd--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( pSttTxtNd && ( pEndTxtNd || pSttTxtNd->GetTxt().Len() ) )
|
2006-03-31 08:52:16 +00:00
|
|
|
aRg.aStart++;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-03-31 08:52:16 +00:00
|
|
|
// Step 3: Moving into UndoArray...
|
|
|
|
nNode = rNds.GetEndOfContent().GetIndex();
|
2000-09-18 23:08:29 +00:00
|
|
|
rDocNds._MoveNodes( aRg, rNds, SwNodeIndex( rNds.GetEndOfContent() ));
|
|
|
|
pMvStt = new SwNodeIndex( rNds, nNode );
|
2006-03-31 08:52:16 +00:00
|
|
|
nNode = rNds.GetEndOfContent().GetIndex() - nNode; // Differenz merken !
|
|
|
|
if( pSttTxtNd && pEndTxtNd )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
//Step 4: Moving around sections
|
2000-09-18 23:08:29 +00:00
|
|
|
nSectDiff = aRg.aEnd.GetIndex() - aRg.aStart.GetIndex();
|
2006-03-31 08:52:16 +00:00
|
|
|
// nSect is the number of sections which starts(ends) between start and end node of the
|
|
|
|
// selection. The "loser" paragraph has to be moved into the section(s) of the
|
|
|
|
// "winner" paragraph
|
|
|
|
if( nSectDiff )
|
|
|
|
{
|
|
|
|
if( bJoinNext )
|
|
|
|
{
|
|
|
|
SwNodeRange aMvRg( *pEndTxtNd, 0, *pEndTxtNd, 1 );
|
|
|
|
rDocNds._MoveNodes( aMvRg, rDocNds, aRg.aStart, TRUE );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SwNodeRange aMvRg( *pSttTxtNd, 0, *pSttTxtNd, 1 );
|
|
|
|
rDocNds._MoveNodes( aMvRg, rDocNds, aRg.aEnd, TRUE );
|
|
|
|
}
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2006-03-31 08:52:16 +00:00
|
|
|
if( nSectDiff || nReplaceDummy )
|
|
|
|
lcl_MakeAutoFrms( *pDoc->GetSpzFrmFmts(),
|
|
|
|
bJoinNext ? pEndTxtNd->GetIndex() : pSttTxtNd->GetIndex() );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
nNode = 0; // kein Node verschoben -> keine Differenz zum Ende
|
|
|
|
|
|
|
|
// wurden davor noch Nodes geloescht ?? (FootNotes haben ContentNodes!)
|
|
|
|
if( !pSttTxtNd && !pEndTxtNd )
|
|
|
|
{
|
|
|
|
nNdDiff = nSttNode - rPam.GetPoint()->nNode.GetIndex() - (bFullPara ? 0 : 1);
|
|
|
|
rPam.Move( fnMoveForward, fnGoNode );
|
|
|
|
}
|
|
|
|
else
|
2006-03-31 08:52:16 +00:00
|
|
|
{
|
|
|
|
nNdDiff = nSttNode;
|
|
|
|
if( nSectDiff && bBackSp )
|
|
|
|
nNdDiff += nSectDiff;
|
|
|
|
nNdDiff -= rPam.GetPoint()->nNode.GetIndex();
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( !rPam.GetNode()->IsCntntNode() )
|
|
|
|
rPam.GetPoint()->nContent.Assign( 0, 0 );
|
|
|
|
|
|
|
|
// wird die History ueberhaupt benoetigt ??
|
|
|
|
if( pHistory && !pHistory->Count() )
|
|
|
|
DELETEZ( pHistory );
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL SwUndoDelete::SaveCntnt( const SwPosition* pStt, const SwPosition* pEnd,
|
|
|
|
SwTxtNode* pSttTxtNd, SwTxtNode* pEndTxtNd )
|
|
|
|
{
|
|
|
|
ULONG nNdIdx = pStt->nNode.GetIndex();
|
|
|
|
// 1 - kopiere den Anfang in den Start-String
|
|
|
|
if( pSttTxtNd )
|
|
|
|
{
|
|
|
|
BOOL bOneNode = nSttNode == nEndNode;
|
|
|
|
xub_StrLen nLen = bOneNode ? nEndCntnt - nSttCntnt
|
|
|
|
: pSttTxtNd->GetTxt().Len() - nSttCntnt;
|
|
|
|
SwRegHistory aRHst( *pSttTxtNd, pHistory );
|
|
|
|
// immer alle TextAttribute sichern; ist fuers Undo mit voll-
|
|
|
|
// staendiger Attributierung am besten, wegen den evt.
|
|
|
|
// Ueberlappenden Bereichen von An/Aus.
|
|
|
|
pHistory->CopyAttr( pSttTxtNd->GetpSwpHints(), nNdIdx,
|
|
|
|
0, pSttTxtNd->GetTxt().Len(), TRUE );
|
2006-12-01 14:48:41 +00:00
|
|
|
if( !bOneNode && pSttTxtNd->HasSwAttrSet() )
|
2008-06-13 09:27:43 +00:00
|
|
|
pHistory->CopyFmtAttr( *pSttTxtNd->GetpSwAttrSet(), nNdIdx );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
// die Laenge kann sich veraendert haben (!!Felder!!)
|
|
|
|
nLen = ( bOneNode ? pEnd->nContent.GetIndex() : pSttTxtNd->GetTxt().Len() )
|
|
|
|
- pStt->nContent.GetIndex();
|
|
|
|
|
|
|
|
// loesche jetzt noch den Text (alle Attribut-Aenderungen kommen in
|
|
|
|
// die Undo-History
|
|
|
|
pSttStr = (String*)new String( pSttTxtNd->GetTxt().Copy( nSttCntnt, nLen ));
|
|
|
|
pSttTxtNd->Erase( pStt->nContent, nLen );
|
|
|
|
if( pSttTxtNd->GetpSwpHints() )
|
|
|
|
pSttTxtNd->GetpSwpHints()->DeRegister();
|
|
|
|
|
|
|
|
if( bOneNode )
|
|
|
|
return FALSE; // keine Nodes mehr verschieben
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2 - kopiere das Ende in den End-String
|
|
|
|
if( pEndTxtNd )
|
|
|
|
{
|
|
|
|
SwIndex aEndIdx( pEndTxtNd );
|
|
|
|
nNdIdx = pEnd->nNode.GetIndex();
|
|
|
|
SwRegHistory aRHst( *pEndTxtNd, pHistory );
|
|
|
|
|
|
|
|
// immer alle TextAttribute sichern; ist fuers Undo mit voll-
|
|
|
|
// staendiger Attributierung am besten, wegen den evt.
|
|
|
|
// Ueberlappenden Bereichen von An/Aus.
|
|
|
|
pHistory->CopyAttr( pEndTxtNd->GetpSwpHints(), nNdIdx, 0,
|
|
|
|
pEndTxtNd->GetTxt().Len(), TRUE );
|
|
|
|
|
2006-12-01 14:48:41 +00:00
|
|
|
if( pEndTxtNd->HasSwAttrSet() )
|
2008-06-13 09:27:43 +00:00
|
|
|
pHistory->CopyFmtAttr( *pEndTxtNd->GetpSwAttrSet(), nNdIdx );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
// loesche jetzt noch den Text (alle Attribut-Aenderungen kommen in
|
|
|
|
// die Undo-History
|
|
|
|
pEndStr = (String*)new String( pEndTxtNd->GetTxt().Copy( 0,
|
|
|
|
pEnd->nContent.GetIndex() ));
|
|
|
|
pEndTxtNd->Erase( aEndIdx, pEnd->nContent.GetIndex() );
|
|
|
|
if( pEndTxtNd->GetpSwpHints() )
|
|
|
|
pEndTxtNd->GetpSwpHints()->DeRegister();
|
|
|
|
}
|
|
|
|
|
|
|
|
// sind es nur zwei Nodes, dann ist schon alles erledigt.
|
|
|
|
if( ( pSttTxtNd || pEndTxtNd ) && nSttNode + 1 == nEndNode )
|
|
|
|
return FALSE; // keine Nodes mehr verschieben
|
|
|
|
|
|
|
|
return TRUE; // verschiebe die dazwischen liegenden Nodes
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL SwUndoDelete::CanGrouping( SwDoc* pDoc, const SwPaM& rDelPam )
|
|
|
|
{
|
|
|
|
// ist das Undo groesser als 1 Node ? (sprich: Start und EndString)
|
|
|
|
if( pSttStr ? !pSttStr->Len() || pEndStr : TRUE )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
// es kann nur das Loeschen von einzelnen char's zusammengefasst werden
|
|
|
|
if( nSttNode != nEndNode || ( !bGroup && nSttCntnt+1 != nEndCntnt ))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
const SwPosition *pStt = rDelPam.Start(),
|
|
|
|
*pEnd = rDelPam.GetPoint() == pStt
|
|
|
|
? rDelPam.GetMark()
|
|
|
|
: rDelPam.GetPoint();
|
|
|
|
|
|
|
|
if( pStt->nNode != pEnd->nNode ||
|
|
|
|
pStt->nContent.GetIndex()+1 != pEnd->nContent.GetIndex() ||
|
|
|
|
pEnd->nNode != nSttNode )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
// untercheide zwischen BackSpace und Delete. Es muss dann das
|
|
|
|
// Undo-Array unterschiedlich aufgebaut werden !!
|
|
|
|
if( pEnd->nContent == nSttCntnt )
|
|
|
|
{
|
|
|
|
if( bGroup && !bBackSp ) return FALSE;
|
|
|
|
bBackSp = TRUE;
|
|
|
|
}
|
|
|
|
else if( pStt->nContent == nSttCntnt )
|
|
|
|
{
|
|
|
|
if( bGroup && bBackSp ) return FALSE;
|
|
|
|
bBackSp = FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
// sind die beiden Nodes (Nodes-/Undo-Array) ueberhaupt TextNodes?
|
|
|
|
SwTxtNode * pDelTxtNd = pStt->nNode.GetNode().GetTxtNode();
|
|
|
|
if( !pDelTxtNd ) return FALSE;
|
|
|
|
|
|
|
|
xub_StrLen nUChrPos = bBackSp ? 0 : pSttStr->Len()-1;
|
|
|
|
sal_Unicode cDelChar = pDelTxtNd->GetTxt().GetChar( pStt->nContent.GetIndex() );
|
2000-10-25 14:13:25 +00:00
|
|
|
CharClass& rCC = GetAppCharClass();
|
2005-01-21 09:42:10 +00:00
|
|
|
if( ( CH_TXTATR_BREAKWORD == cDelChar || CH_TXTATR_INWORD == cDelChar ) ||
|
2000-10-25 14:13:25 +00:00
|
|
|
rCC.isLetterNumeric( String( cDelChar ), 0 ) !=
|
|
|
|
rCC.isLetterNumeric( *pSttStr, nUChrPos ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
{
|
|
|
|
SwRedlineSaveDatas* pTmpSav = new SwRedlineSaveDatas;
|
|
|
|
if( !FillSaveData( rDelPam, *pTmpSav, FALSE ))
|
|
|
|
delete pTmpSav, pTmpSav = 0;
|
|
|
|
|
|
|
|
BOOL bOk = ( !pRedlSaveData && !pTmpSav ) ||
|
|
|
|
( pRedlSaveData && pTmpSav &&
|
|
|
|
SwUndo::CanRedlineGroup( *pRedlSaveData, *pTmpSav, bBackSp ));
|
|
|
|
delete pTmpSav;
|
|
|
|
if( !bOk )
|
|
|
|
return FALSE;
|
|
|
|
|
2006-08-14 15:49:20 +00:00
|
|
|
pDoc->DeleteRedline( rDelPam, false, USHRT_MAX );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Ok, die beiden 'Deletes' koennen zusammen gefasst werden, also
|
|
|
|
// 'verschiebe' das enstprechende Zeichen
|
|
|
|
if( bBackSp )
|
|
|
|
nSttCntnt--; // BackSpace: Zeichen in Array einfuegen !!
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nEndCntnt++; // Delete: Zeichen am Ende anhaengen
|
|
|
|
nUChrPos++;
|
|
|
|
}
|
|
|
|
pSttStr->Insert( cDelChar, nUChrPos );
|
|
|
|
pDelTxtNd->Erase( pStt->nContent, 1 );
|
|
|
|
|
|
|
|
bGroup = TRUE;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SwUndoDelete::~SwUndoDelete()
|
|
|
|
{
|
|
|
|
delete pSttStr;
|
|
|
|
delete pEndStr;
|
|
|
|
if( pMvStt ) // loesche noch den Bereich aus dem UndoNodes Array
|
|
|
|
{
|
|
|
|
// Insert speichert den Inhalt in der IconSection
|
|
|
|
pMvStt->GetNode().GetNodes().Delete( *pMvStt, nNode );
|
|
|
|
delete pMvStt;
|
|
|
|
}
|
|
|
|
delete pRedlData;
|
|
|
|
delete pRedlSaveData;
|
|
|
|
}
|
|
|
|
|
2004-09-08 13:59:07 +00:00
|
|
|
static SwRewriter lcl_RewriterFromHistory(SwHistory & rHistory)
|
|
|
|
{
|
|
|
|
SwRewriter aRewriter;
|
|
|
|
|
|
|
|
bool bDone = false;
|
|
|
|
|
2007-09-27 08:30:29 +00:00
|
|
|
for ( USHORT n = 0; n < rHistory.Count(); n++)
|
2004-09-08 13:59:07 +00:00
|
|
|
{
|
|
|
|
String aDescr = rHistory[n]->GetDescription();
|
|
|
|
|
|
|
|
if (aDescr.Len() > 0)
|
|
|
|
{
|
|
|
|
aRewriter.AddRule(UNDO_ARG2, aDescr);
|
|
|
|
|
|
|
|
bDone = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! bDone)
|
|
|
|
{
|
|
|
|
aRewriter.AddRule(UNDO_ARG2, SW_RES(STR_FIELD));
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRewriter;
|
|
|
|
}
|
|
|
|
|
2004-05-18 13:07:16 +00:00
|
|
|
SwRewriter SwUndoDelete::GetRewriter() const
|
|
|
|
{
|
|
|
|
SwRewriter aResult;
|
|
|
|
String * pStr = NULL;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2004-05-18 13:07:16 +00:00
|
|
|
if (nNode != 0)
|
2004-09-08 13:59:07 +00:00
|
|
|
{
|
|
|
|
if (sTableName.Len() > 0)
|
|
|
|
{
|
|
|
|
|
|
|
|
SwRewriter aRewriter;
|
|
|
|
aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_START_QUOTE));
|
|
|
|
aRewriter.AddRule(UNDO_ARG2, sTableName);
|
|
|
|
aRewriter.AddRule(UNDO_ARG3, SW_RES(STR_END_QUOTE));
|
|
|
|
|
|
|
|
String sTmp = aRewriter.Apply(SW_RES(STR_TABLE_NAME));
|
|
|
|
aResult.AddRule(UNDO_ARG1, sTmp);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
aResult.AddRule(UNDO_ARG1, String(SW_RES(STR_PARAGRAPHS)));
|
|
|
|
}
|
2004-05-18 13:07:16 +00:00
|
|
|
else
|
|
|
|
{
|
2004-09-08 13:59:07 +00:00
|
|
|
String aStr;
|
2004-11-09 12:49:37 +00:00
|
|
|
|
|
|
|
if (pSttStr != NULL && pEndStr != NULL && pSttStr->Len() == 0 &&
|
|
|
|
pEndStr->Len() == 0)
|
2004-05-18 13:07:16 +00:00
|
|
|
{
|
2004-11-09 12:49:37 +00:00
|
|
|
aStr = SW_RES(STR_PARAGRAPH_UNDO);
|
2004-09-08 13:59:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-11-09 12:49:37 +00:00
|
|
|
if (pSttStr != NULL)
|
|
|
|
pStr = pSttStr;
|
|
|
|
else if (pEndStr != NULL)
|
|
|
|
pStr = pEndStr;
|
|
|
|
|
|
|
|
if (pStr != NULL)
|
|
|
|
{
|
|
|
|
aStr = DenoteSpecialCharacters(*pStr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aStr = UNDO_ARG2;
|
|
|
|
}
|
2004-09-08 13:59:07 +00:00
|
|
|
}
|
2004-05-18 13:07:16 +00:00
|
|
|
|
2009-02-13 11:19:56 +00:00
|
|
|
aStr = ShortenString(aStr, nUndoStringLength, String(SW_RES(STR_LDOTS)));
|
2004-09-08 13:59:07 +00:00
|
|
|
if (pHistory)
|
|
|
|
{
|
|
|
|
SwRewriter aRewriter = lcl_RewriterFromHistory(*pHistory);
|
|
|
|
aStr = aRewriter.Apply(aStr);
|
|
|
|
}
|
|
|
|
|
|
|
|
aResult.AddRule(UNDO_ARG1, aStr);
|
2004-05-18 13:07:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return aResult;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-03-31 08:52:16 +00:00
|
|
|
// Every object, anchored "AtCntnt" will be reanchored at rPos
|
|
|
|
void lcl_ReAnchorAtCntntFlyFrames( const SwSpzFrmFmts& rSpzArr, SwPosition &rPos, ULONG nOldIdx )
|
|
|
|
{
|
|
|
|
if( rSpzArr.Count() )
|
|
|
|
{
|
|
|
|
SwFlyFrmFmt* pFmt;
|
|
|
|
const SwFmtAnchor* pAnchor;
|
|
|
|
const SwPosition* pAPos;
|
|
|
|
for( USHORT n = 0; n < rSpzArr.Count(); ++n )
|
|
|
|
{
|
|
|
|
pFmt = (SwFlyFrmFmt*)rSpzArr[n];
|
|
|
|
pAnchor = &pFmt->GetAnchor();
|
|
|
|
if( pAnchor->GetAnchorId() == FLY_AT_CNTNT )
|
|
|
|
{
|
|
|
|
pAPos = pAnchor->GetCntntAnchor();
|
|
|
|
if( pAPos && nOldIdx == pAPos->nNode.GetIndex() )
|
|
|
|
{
|
|
|
|
SwFmtAnchor aAnch( *pAnchor );
|
|
|
|
aAnch.SetAnchor( &rPos );
|
2008-06-13 09:27:43 +00:00
|
|
|
pFmt->SetFmtAttr( aAnch );
|
2006-03-31 08:52:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
void SwUndoDelete::Undo( SwUndoIter& rUndoIter )
|
|
|
|
{
|
|
|
|
SwDoc* pDoc = &rUndoIter.GetDoc();
|
|
|
|
BOOL bUndo = pDoc->DoesUndo();
|
|
|
|
pDoc->DoUndo( FALSE );
|
|
|
|
|
|
|
|
ULONG nCalcStt = nSttNode - nNdDiff;
|
|
|
|
|
2006-03-31 08:52:16 +00:00
|
|
|
if( nSectDiff && bBackSp )
|
|
|
|
nCalcStt += nSectDiff;
|
|
|
|
|
|
|
|
SwNodeIndex aIdx( pDoc->GetNodes(), nCalcStt );
|
2000-09-18 23:08:29 +00:00
|
|
|
SwNode* pInsNd = &aIdx.GetNode();
|
|
|
|
|
|
|
|
{ // Block, damit der SwPosition beim loeschen vom Node
|
|
|
|
// abgemeldet ist
|
|
|
|
SwPosition aPos( aIdx );
|
|
|
|
if( !bDelFullPara )
|
|
|
|
{
|
|
|
|
if( pInsNd->IsTableNode() )
|
|
|
|
{
|
|
|
|
pInsNd = pDoc->GetNodes().MakeTxtNode( aIdx,
|
|
|
|
(SwTxtFmtColl*)pDoc->GetDfltTxtFmtColl() );
|
|
|
|
aIdx--;
|
|
|
|
aPos.nNode = aIdx;
|
|
|
|
aPos.nContent.Assign( pInsNd->GetCntntNode(), nSttCntnt );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( pInsNd->IsCntntNode() )
|
|
|
|
aPos.nContent.Assign( (SwCntntNode*)pInsNd, nSttCntnt );
|
|
|
|
if( !bTblDelLastNd )
|
|
|
|
pInsNd = 0; // Node nicht loeschen !!
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pInsNd = 0; // Node nicht loeschen !!
|
|
|
|
|
|
|
|
SwNodes* pUNds = (SwNodes*)pDoc->GetUndoNds();
|
|
|
|
BOOL bNodeMove = 0 != nNode;
|
|
|
|
|
2006-03-31 08:52:16 +00:00
|
|
|
if( pEndStr )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
// alle Attribute verwerfen, wurden alle gespeichert!
|
|
|
|
SwTxtNode* pTxtNd = aPos.nNode.GetNode().GetTxtNode();
|
2006-03-31 08:52:16 +00:00
|
|
|
|
2006-12-01 14:48:41 +00:00
|
|
|
if( pTxtNd && pTxtNd->HasSwAttrSet() )
|
2000-09-18 23:08:29 +00:00
|
|
|
pTxtNd->ResetAllAttr();
|
|
|
|
|
2006-08-14 15:49:20 +00:00
|
|
|
if( pTxtNd && pTxtNd->GetpSwpHints() )
|
2006-12-01 14:48:41 +00:00
|
|
|
pTxtNd->ClearSwpHintsArr( true );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-07-13 10:31:46 +00:00
|
|
|
if( pSttStr && !bFromTableCopy )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
ULONG nOldIdx = aPos.nNode.GetIndex();
|
2006-08-14 15:49:20 +00:00
|
|
|
pDoc->SplitNode( aPos, false );
|
2006-03-31 08:52:16 +00:00
|
|
|
// After the split all objects are anchored at the first paragraph,
|
|
|
|
// but the pHistory of the fly frame formats relies on anchoring at
|
|
|
|
// the start of the selection => selection backwards needs a correction.
|
|
|
|
if( bBackSp )
|
|
|
|
lcl_ReAnchorAtCntntFlyFrames( *pDoc->GetSpzFrmFmts(), aPos, nOldIdx );
|
2000-09-18 23:08:29 +00:00
|
|
|
pTxtNd = aPos.nNode.GetNode().GetTxtNode();
|
|
|
|
}
|
2008-01-15 12:50:07 +00:00
|
|
|
if( pTxtNd ) // Robust
|
|
|
|
pTxtNd->Insert( *pEndStr, aPos.nContent, INS_NOHINTEXPAND );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else if( pSttStr && bNodeMove )
|
|
|
|
{
|
|
|
|
SwTxtNode * pNd = aPos.nNode.GetNode().GetTxtNode();
|
|
|
|
if( pNd )
|
|
|
|
{
|
|
|
|
if( nSttCntnt < pNd->GetTxt().Len() )
|
2006-03-31 08:52:16 +00:00
|
|
|
{
|
|
|
|
ULONG nOldIdx = aPos.nNode.GetIndex();
|
2006-08-14 15:49:20 +00:00
|
|
|
pDoc->SplitNode( aPos, false );
|
2006-03-31 08:52:16 +00:00
|
|
|
if( bBackSp )
|
|
|
|
lcl_ReAnchorAtCntntFlyFrames( *pDoc->GetSpzFrmFmts(), aPos, nOldIdx );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
|
|
|
aPos.nNode++;
|
|
|
|
}
|
|
|
|
}
|
2006-03-31 08:52:16 +00:00
|
|
|
SwNode* pMovedNode = NULL;
|
|
|
|
if( nSectDiff )
|
|
|
|
{
|
|
|
|
ULONG nMoveIndex = aPos.nNode.GetIndex();
|
|
|
|
int nDiff = 0;
|
|
|
|
if( bJoinNext )
|
|
|
|
{
|
|
|
|
nMoveIndex += nSectDiff + 1;
|
|
|
|
pMovedNode = &aPos.nNode.GetNode();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nMoveIndex -= nSectDiff + 1;
|
|
|
|
++nDiff;
|
|
|
|
}
|
|
|
|
SwNodeIndex aMvIdx( pDoc->GetNodes(), nMoveIndex );
|
|
|
|
SwNodeRange aRg( aPos.nNode, 0 - nDiff, aPos.nNode, 1 - nDiff );
|
|
|
|
aPos.nNode--;
|
|
|
|
if( !bJoinNext )
|
|
|
|
pMovedNode = &aPos.nNode.GetNode();
|
|
|
|
pDoc->GetNodes()._MoveNodes( aRg, pDoc->GetNodes(), aMvIdx, TRUE );
|
|
|
|
aPos.nNode++;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( bNodeMove )
|
|
|
|
{
|
2007-09-27 08:30:29 +00:00
|
|
|
SwNodeRange aRange( *pMvStt, 0, *pMvStt, nNode );
|
2006-03-31 08:52:16 +00:00
|
|
|
SwNodeIndex aCopyIndex( aPos.nNode, -1 );
|
2007-09-27 08:30:29 +00:00
|
|
|
pUNds->_Copy( aRange, aPos.nNode );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-03-31 08:52:16 +00:00
|
|
|
if( nReplaceDummy )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
ULONG nMoveIndex;
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bJoinNext )
|
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
nMoveIndex = nEndNode - nNdDiff;
|
|
|
|
aPos.nNode = nMoveIndex + nReplaceDummy;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
aPos = aCopyIndex;
|
|
|
|
nMoveIndex = aPos.nNode.GetIndex() + nReplaceDummy + 1;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2006-03-31 08:52:16 +00:00
|
|
|
SwNodeIndex aMvIdx( pDoc->GetNodes(), nMoveIndex );
|
|
|
|
SwNodeRange aRg( aPos.nNode, 0, aPos.nNode, 1 );
|
|
|
|
pMovedNode = &aPos.nNode.GetNode();
|
|
|
|
pDoc->GetNodes()._MoveNodes( aRg, pDoc->GetNodes(), aMvIdx, TRUE );
|
|
|
|
pDoc->GetNodes().Delete( aMvIdx, 1 );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
2006-03-31 08:52:16 +00:00
|
|
|
|
|
|
|
if( pMovedNode )
|
|
|
|
lcl_MakeAutoFrms( *pDoc->GetSpzFrmFmts(), pMovedNode->GetIndex() );
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pSttStr )
|
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
aPos.nNode = nSttNode - nNdDiff + ( bJoinNext ? 0 : nReplaceDummy );
|
2000-09-18 23:08:29 +00:00
|
|
|
SwTxtNode * pTxtNd = aPos.nNode.GetNode().GetTxtNode();
|
|
|
|
// wenn mehr als ein Node geloescht wurde, dann wurden auch
|
|
|
|
// alle "Node"-Attribute gespeichert
|
|
|
|
|
2006-01-20 12:48:40 +00:00
|
|
|
if (pTxtNd != NULL)
|
|
|
|
{
|
2006-12-01 14:48:41 +00:00
|
|
|
if( pTxtNd->HasSwAttrSet() && bNodeMove && !pEndStr )
|
2006-01-20 12:48:40 +00:00
|
|
|
pTxtNd->ResetAllAttr();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-01-20 12:48:40 +00:00
|
|
|
if( pTxtNd->GetpSwpHints() )
|
2006-12-01 14:48:41 +00:00
|
|
|
pTxtNd->ClearSwpHintsArr( true );
|
2006-01-20 12:48:40 +00:00
|
|
|
|
|
|
|
// SectionNode-Modus und von oben nach unten selektiert:
|
|
|
|
// -> im StartNode steht noch der Rest vom Join => loeschen
|
|
|
|
aPos.nContent.Assign( pTxtNd, nSttCntnt );
|
|
|
|
pTxtNd->Insert( *pSttStr, aPos.nContent, INS_NOHINTEXPAND );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if( pHistory )
|
|
|
|
{
|
|
|
|
pHistory->TmpRollback( pDoc, nSetPos, FALSE );
|
|
|
|
if( nSetPos ) // es gab Fussnoten/FlyFrames
|
|
|
|
{
|
|
|
|
// gibts ausser diesen noch andere ?
|
|
|
|
if( nSetPos < pHistory->Count() )
|
|
|
|
{
|
|
|
|
// dann sicher die Attribute anderen Attribute
|
|
|
|
SwHistory aHstr;
|
|
|
|
aHstr.Move( 0, pHistory, nSetPos );
|
|
|
|
pHistory->Rollback( pDoc );
|
|
|
|
pHistory->Move( 0, &aHstr );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pHistory->Rollback( pDoc );
|
|
|
|
DELETEZ( pHistory );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( bResetPgDesc || bResetPgBrk )
|
|
|
|
{
|
2007-09-27 08:30:29 +00:00
|
|
|
USHORT nStt = static_cast<USHORT>( bResetPgDesc ? RES_PAGEDESC : RES_BREAK );
|
|
|
|
USHORT nEnd = static_cast<USHORT>( bResetPgBrk ? RES_BREAK : RES_PAGEDESC );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SwNode* pNode = pDoc->GetNodes()[ nEndNode + 1 ];
|
|
|
|
if( pNode->IsCntntNode() )
|
|
|
|
((SwCntntNode*)pNode)->ResetAttr( nStt, nEnd );
|
|
|
|
else if( pNode->IsTableNode() )
|
2008-06-13 09:27:43 +00:00
|
|
|
((SwTableNode*)pNode)->GetTable().GetFrmFmt()->ResetFmtAttr( nStt, nEnd );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// den temp. eingefuegten Node noch loeschen !!
|
|
|
|
if( pInsNd )
|
|
|
|
pDoc->GetNodes().Delete( aIdx, 1 );
|
|
|
|
if( pRedlSaveData )
|
|
|
|
SetSaveData( *pDoc, *pRedlSaveData );
|
|
|
|
|
|
|
|
pDoc->DoUndo( bUndo ); // Undo wieder einschalten
|
|
|
|
SetPaM( rUndoIter, TRUE );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwUndoDelete::Redo( SwUndoIter& rUndoIter )
|
|
|
|
{
|
|
|
|
rUndoIter.SetUpdateAttr( TRUE );
|
|
|
|
|
|
|
|
SwPaM& rPam = *rUndoIter.pAktPam;
|
|
|
|
SwDoc& rDoc = *rPam.GetDoc();
|
|
|
|
|
|
|
|
SetPaM( rPam );
|
|
|
|
|
|
|
|
if( pRedlSaveData )
|
2006-08-14 15:49:20 +00:00
|
|
|
rDoc.DeleteRedline( rPam, false, USHRT_MAX );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( !bDelFullPara )
|
|
|
|
{
|
2001-05-23 15:00:54 +00:00
|
|
|
SwUndRng aTmpRng( rPam );
|
2000-09-18 23:08:29 +00:00
|
|
|
RemoveIdxFromRange( rPam, FALSE );
|
2001-05-23 15:00:54 +00:00
|
|
|
aTmpRng.SetPaM( rPam );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( !bJoinNext ) // Dann Selektion von unten nach oben
|
|
|
|
rPam.Exchange(); // wieder herstellen!
|
|
|
|
}
|
|
|
|
|
|
|
|
if( pHistory ) // wurden Attribute gesichert ?
|
|
|
|
{
|
|
|
|
pHistory->SetTmpEnd( pHistory->Count() );
|
|
|
|
SwHistory aHstr;
|
|
|
|
aHstr.Move( 0, pHistory );
|
|
|
|
|
|
|
|
if( bDelFullPara )
|
|
|
|
{
|
|
|
|
ASSERT( rPam.HasMark(), "PaM ohne Mark" );
|
|
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint(),
|
2007-09-27 08:30:29 +00:00
|
|
|
DelCntntType(nsDelCntntType::DELCNT_ALL | nsDelCntntType::DELCNT_CHKNOCNTNT) );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
CWS-TOOLING: integrate CWS swrefactormarks2
2009-04-09 12:51:41 +0200 b_michaelsen r270689 : #i94949# cleaned up assertions after rebasing
2009-04-08 17:37:08 +0200 b_michaelsen r270658 : fixing sw/source/ui/utlui/makefile.mk
2009-04-07 17:56:54 +0200 b_michaelsen r270606 : added bookctrl.cxx to EXCEPTIONFILES, because this is needed for stl on unxsols4
2009-04-07 17:05:20 +0200 b_michaelsen r270603 : added crbm.cxx to EXCEPTIONFILES, because this is needed for stl on unxsols4
2009-04-02 23:44:38 +0200 b_michaelsen r270436 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@270033 (milestone: DEV300:m45)
2009-02-27 16:25:31 +0100 b_michaelsen r268606 : #i94949# fixed Windows buildbreaker
2009-02-25 18:01:13 +0100 b_michaelsen r268464 : #i94949# Bookmarktest document filter roundtrips
2009-02-24 18:23:55 +0100 b_michaelsen r268404 : #i94949# Bookmark unittests
2009-02-23 19:47:44 +0100 b_michaelsen r268370 : #i94949# added unittest for bookmarks
2009-02-23 12:22:07 +0100 b_michaelsen r268348 : #i94949# fixing CheckCrossReferences testcase
2009-02-20 18:12:50 +0100 b_michaelsen r268335 : #i94949# fixing SwXTextRange
2009-02-18 18:32:57 +0100 b_michaelsen r268252 : #i94949# deregistering DdeBookmarks on delete
2009-02-18 18:29:08 +0100 b_michaelsen r268251 : fixing dbgoutsw.cxx for debug builds
2009-02-16 18:42:43 +0100 b_michaelsen r267834 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@267171 (milestone: DEV300:m41)
2009-02-12 15:32:02 +0100 b_michaelsen r267667 : #i94949 fixed crossrefbookmark naming
2009-02-11 18:30:08 +0100 b_michaelsen r267624 : #94949# fixing bookmark navigation
2009-02-11 13:55:26 +0100 b_michaelsen r267599 : #i94949# fixed bookmark naming
2009-02-10 17:53:05 +0100 b_michaelsen r267571 : #i94949# renamed HasOtherMarkPos to IsExpanded
2009-02-10 17:23:01 +0100 b_michaelsen r267564 : #i94949# renamed ::sw::bookmark namespace to more fitting ::sw::mark
2009-02-10 16:16:32 +0100 b_michaelsen r267553 : #i94949# creating only CrossRefBookmark per Txtnode
2009-02-10 12:14:05 +0100 b_michaelsen r267547 : #i94949# fixed bookmark count in navigator
2009-02-09 19:12:18 +0100 b_michaelsen r267532 : #i94949# lcl_CopyBookmarks(..) - handle marks on boundaries correctly
2009-02-09 17:32:45 +0100 b_michaelsen r267524 : #i94949# setting the refobject of the DdeBookmark in Sin SwServerObject::SetDdeBookmark(..)
2009-02-09 17:22:15 +0100 b_michaelsen r267523 : #i94949# trying to harden SwServerObject
2009-02-09 16:47:32 +0100 b_michaelsen r267521 : #i94949# lcl_CopyBookmarks(..): try to get the source mark name, if possible
2009-02-09 16:05:42 +0100 b_michaelsen r267519 : #i94949# clearing the OtherMarkPos if PaM has no mark in repositionMark(..), swapping inverted bookmarks without hissing an assertion
2009-02-09 15:55:38 +0100 b_michaelsen r267518 : #i94949# checking for out-of-bounds in SwView::ExecuteStatusLine(..)
2009-02-09 15:23:47 +0100 b_michaelsen r267517 : #i94949# using an UNO_BOOKMARK in ui/dbui/dbinsdlg.cxx
2009-02-09 14:14:47 +0100 b_michaelsen r267514 : #i94949# IDocumentMarkAccess::GetType(..) asserts on unknown type
2009-02-09 14:04:25 +0100 b_michaelsen r267513 : #i94949# using rtl strings instead of tools-strings in CrossRefBookmarks
2009-02-09 13:55:01 +0100 b_michaelsen r267510 : #i94949# using empty string for UnoMark construction
2009-02-09 13:46:46 +0100 b_michaelsen r267509 : #i94949# removed superfluous #includes, removed superfluous member DdeBookmark::bGenerateName, initialized DdeBookmark::m_aRefObj removed superfluous local _FindItem::ClearObj
2009-02-06 14:38:37 +0100 b_michaelsen r267462 : #i94949# fixing FN_STAT_BOOKMARK dispatches
2009-02-05 18:05:07 +0100 b_michaelsen r267436 : #i94949# removing superfluous #includes
2009-02-04 15:51:31 +0100 b_michaelsen r267391 : fixing resync merge error
2009-02-02 19:39:55 +0100 b_michaelsen r267294 : #i94949# bookmark performance
2009-01-30 19:30:51 +0100 b_michaelsen r267229 : #i94949# throwing IllegalArgumentException, if appropriate
2009-01-30 19:29:56 +0100 b_michaelsen r267228 : #i94949# refactored lcl_FillBookmarkArray, comments, constness
2009-01-30 19:23:49 +0100 b_michaelsen r267227 : #i94949# refactored lcl_FillBookmarkArray, comments, constness
2009-01-30 19:16:06 +0100 b_michaelsen r267226 : #i94949# refactored lcl_FillBookmarkArray
2009-01-30 17:59:27 +0100 b_michaelsen r267222 : #i94949# removed superficial #include
2009-01-30 17:50:02 +0100 b_michaelsen r267220 : #i94949# SwXTextRange remembers its UNO bookmark
2009-01-29 20:19:58 +0100 b_michaelsen r267168 : #i94949# implemented IDocumentMarkAccess::findBookmark
2009-01-29 17:22:17 +0100 b_michaelsen r267162 : #i94949# implemented renameMark in Markmanager
2009-01-29 14:17:10 +0100 b_michaelsen r267134 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:21:54 +0100 b_michaelsen r267125 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:06:10 +0100 b_michaelsen r267120 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:00:09 +0100 b_michaelsen r267118 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 10:35:10 +0100 b_michaelsen r267101 : #i94949# renamed SetCrsrToBkmk to SetCrsrToMark, moving to start/end of doc if no more bookmarks can be found
2009-01-28 17:05:36 +0100 b_michaelsen r267070 : #i94949# fixed order in aProvNamesId in unocoll.cxx
2009-01-28 15:46:13 +0100 b_michaelsen r267063 : #i94949# documentation
2009-01-28 15:36:59 +0100 b_michaelsen r267062 : #i94949# removing superficial #include
2009-01-28 15:30:36 +0100 b_michaelsen r267061 : #i94949# basic code conventions
2009-01-28 11:14:30 +0100 b_michaelsen r267039 : #i94949# comparing to the actual name of the new mark
2009-01-26 15:22:25 +0100 b_michaelsen r266927 : #i94949# performance fixes
2009-01-14 21:16:56 +0100 b_michaelsen r266332 : #i94949# fixing linux x86-64 compiler warnings
2009-01-14 19:52:06 +0100 b_michaelsen r266331 : #i94949# fixing some compiler warnings
2008-12-15 13:04:49 +0100 b_michaelsen r265474 : #i94949# fixed microsoft compiler warnings
2008-12-12 18:26:02 +0100 b_michaelsen r265434 : #i94949# fixed pro platform buildbreakers
2008-12-11 17:51:24 +0100 b_michaelsen r265342 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@264807 (milestone: DEV300:m37)
2008-12-09 18:30:59 +0100 b_michaelsen r265134 : #i94949# fixed IDocumentMarkAccess::GetType for new mark inheritance tree
2008-12-09 16:56:26 +0100 b_michaelsen r265118 : #i94949# fixed deleteMark optimization
2008-12-09 14:55:58 +0100 b_michaelsen r265092 : #i94949# DdeLink and DdeBookmark
2008-12-05 18:28:05 +0100 b_michaelsen r264914 : #i94949# fixed InitDoc in bookmarks
2008-12-02 02:23:51 +0100 b_michaelsen r264649 : #i94949# removed obsolete naming proposal code in SwXTextRange, fixed navigator reminders to forget the oldest reminder when the pool is empty
2008-12-02 02:05:19 +0100 b_michaelsen r264648 : #i94949# using bisect search for delete
2008-12-02 01:58:16 +0100 b_michaelsen r264647 : #i94949# using bisect search for delete
2008-12-02 01:37:33 +0100 b_michaelsen r264646 : #i94949# using bisect search for delete
2008-12-02 01:03:29 +0100 b_michaelsen r264645 : #i94949# fixed deleteMark crash
2008-12-01 20:55:00 +0100 b_michaelsen r264638 : #i94949# removed crossrefs from ui enumerations
2008-12-01 15:48:12 +0100 b_michaelsen r264613 : #i94949# removed superfluous local functions
2008-12-01 15:01:19 +0100 b_michaelsen r264608 : #i94949# optimized insertion of new marks
2008-12-01 14:33:21 +0100 b_michaelsen r264603 : #i94949# simplified code finding Fieldmark for a position
2008-12-01 14:05:55 +0100 b_michaelsen r264598 : #i94949# fixed reverse travelling through marks, removed obsolete getUniqueMarkName()
2008-11-27 18:48:15 +0100 b_michaelsen r264515 : #i94949# fixed _SaveCntntIdx and friends
2008-11-27 15:59:49 +0100 b_michaelsen r264500 : #i94949# fix Mark position only in ctor
2008-11-27 15:52:28 +0100 b_michaelsen r264497 : #i94949# fixed Bug in SwXBookmark, was using pDoc too early
2008-11-26 14:54:22 +0100 b_michaelsen r264396 : #i94949# fixed documentation, simplified navigator reminder code
2008-11-24 20:45:51 +0100 b_michaelsen r264266 : #i94949# removed last obsolete getUniqueMarkName calls
2008-11-24 20:21:35 +0100 b_michaelsen r264265 : #i94949# fixed typo in IDocumentMarkAccess, removed obsolete getUniqueMarkName calls
2008-11-24 18:34:32 +0100 b_michaelsen r264264 : #i94949# repositioning of Marks, removed possibility to delete marks by name in the core, refactoring of navigator reminder generation
2008-11-21 14:08:49 +0100 b_michaelsen r264137 : #i94949# simplified makeMark
2008-11-21 12:07:09 +0100 b_michaelsen r264120 : #i94949# moved ShortName and KeyCode from IMark to IBookmark
2008-11-19 12:50:49 +0100 b_michaelsen r263981 : #i94949# starting refactoring of bookmark naming
2008-11-19 11:31:08 +0100 b_michaelsen r263972 : #i94949# getting rid of obsolete dynamic casts
2008-11-18 19:06:09 +0100 b_michaelsen r263795 : #i94949# getting rid of index based mark access, IDocumentMarkAccess already provides iterators
2008-11-18 17:50:18 +0100 b_michaelsen r263792 : #i94949# getting rid of index based mark access, IDocumentMarkAccess already provides iterators
2008-11-18 16:48:20 +0100 b_michaelsen r263783 : #i94949# removed methods from crsrsh which are already available directly via IDocumentMarkAccess
2008-11-18 11:31:35 +0100 b_michaelsen r263753 : #i94949# cleaning up mark code in crsrsh
2008-11-17 10:15:25 +0100 b_michaelsen r263705 : #i94949# removed possible integer overflow
2008-11-14 18:48:45 +0100 b_michaelsen r263695 : #i94949# management of mark names in MarkManager
2008-11-14 18:23:40 +0100 b_michaelsen r263693 : #i94949# using polymorphism to do mark-specific setup in SwDoc
2008-11-14 16:27:09 +0100 b_michaelsen r263684 : #i94949# got rid of makeCrossRefBookmark
2008-11-14 13:03:32 +0100 b_michaelsen r263674 : #i94949# refactored Correction methods
2008-11-13 12:27:55 +0100 b_michaelsen r263631 : #i94949# got rid of old-style tools assertions in new code
2008-11-12 16:58:16 +0100 b_michaelsen r263608 : #i94949# added assertion for unique names
2008-11-12 16:55:18 +0100 b_michaelsen r263607 : #i94949# maked XFormField deprecated
2008-11-12 13:04:29 +0100 b_michaelsen r263587 : #i94949# replaced IDocumentMarkAccess::GetType with simple dynamic_cast where possible
2008-11-11 18:45:53 +0100 b_michaelsen r263572 : #i94949# cleaned up SwHstryBookmark
2008-11-11 13:48:18 +0100 b_michaelsen r263557 : #i94949# removed dynamic_casts to SwModify by inheriting IMark from it
2008-11-11 11:26:28 +0100 b_michaelsen r263548 : #i94949# fixed SwXBookmark
2008-11-10 17:01:19 +0100 b_michaelsen r263529 : #i94949# fixed DdeBookmarks in clipboard
2008-11-10 16:44:52 +0100 b_michaelsen r263527 : #i94949# formatting
2008-11-10 16:29:16 +0100 b_michaelsen r263526 : #i94949# fixing unoobj.cxx
2008-11-10 16:23:50 +0100 b_michaelsen r263525 : #i94949# cleaning up crossrefbookmark.cxx/.hxx
2008-11-10 16:02:08 +0100 b_michaelsen r263524 : #i94949# Pdf Export should only generate 'real' bookmarks
2008-11-10 15:33:58 +0100 b_michaelsen r263521 : #i94949# removed const_casts
2008-11-10 15:12:06 +0100 b_michaelsen r263520 : #i94949# moved _DelBookmarks into MarksManager
2008-11-07 18:48:38 +0100 b_michaelsen r263480 : #i94949# using iterator interface
2008-11-07 18:41:46 +0100 b_michaelsen r263478 : #i94949# using iterator interface
2008-11-07 18:07:41 +0100 b_michaelsen r263477 : #i94949# using iterator interface
2008-11-07 17:54:41 +0100 b_michaelsen r263476 : #i94949# using iterator interface
2008-11-07 17:44:41 +0100 b_michaelsen r263475 : #i94949# moved correction methods into MarkManager
2008-11-06 18:47:28 +0100 b_michaelsen r263404 : #i94949# getting rid of superfluous const_casts
2008-11-06 17:58:01 +0100 b_michaelsen r263403 : #i94949# no more setting of mark positions outside of the core
2008-11-06 17:08:37 +0100 b_michaelsen r263401 : #i94949# removed setters from IMark
2008-11-06 13:55:25 +0100 b_michaelsen r263383 : #i94949 SwDoc does not implement IDocumentMarkAccess anymore
2008-11-04 18:17:03 +0100 b_michaelsen r263333 : #i94949# began removing IDocumentMarkAccess from SwDoc
2008-11-04 16:48:34 +0100 b_michaelsen r263330 : removing dead code (SwBitArray) found by mst
2008-11-04 16:29:32 +0100 b_michaelsen r263329 : removing dead code (SwBitArray) found by mst
2008-11-04 14:57:48 +0100 b_michaelsen r263326 : removing dead code (SwBitArray) found by mst
2008-11-04 14:50:18 +0100 b_michaelsen r263325 : #i94949# stricter typing in IDocumentMarkAccess
2008-10-24 15:16:27 +0200 b_michaelsen r262647 : #i94949# renamed ::sw::bookmark::SimpleMark to NavigatorReminder to fit the IDocumentMarkAccess enum
2008-10-24 15:10:10 +0200 b_michaelsen r262646 : #i94949# only 'real' bookmark implement IBookmark, Marks also get removed from m_vFieldmarks on delete/clear
2008-10-24 13:06:23 +0200 b_michaelsen r262636 : #i94949# Fieldmark tabnavigation
2008-10-23 12:16:36 +0200 b_michaelsen r262619 : #i94949# Fieldmark classes and filters
2008-10-22 13:17:18 +0200 b_michaelsen r262597 : #i94949# writer import fixes
2008-10-21 11:30:38 +0200 b_michaelsen r262565 : #i94949# renamed methods containing Bookmark in the generic IMark interface
2008-10-20 14:09:02 +0200 b_michaelsen r262318 : #i94949# fixed SwDoc::CorrRel
2008-10-16 22:45:13 +0200 b_michaelsen r262273 : #i94949 simplified Before/After methods
2008-10-16 21:40:57 +0200 b_michaelsen r262271 : #i94949 renamed SimpleMark to NavigatorReminder
2008-10-16 21:15:23 +0200 b_michaelsen r262270 : #i94949 using shared_ptr only in MarkManager
2008-10-16 17:46:37 +0200 b_michaelsen r262269 : #i94949# getFieldmarkBefore and getFieldmarkAfter
2008-10-16 17:12:13 +0200 b_michaelsen r262265 : #i94949# cleanup in crbm.cxx
2008-10-16 12:49:01 +0200 b_michaelsen r262257 : #i94949# fixed usage of invalid iterator, fixed invalid cast
2008-10-15 15:34:20 +0200 b_michaelsen r262239 : #i94949# added moved files
2008-10-15 15:26:45 +0200 b_michaelsen r262237 : #i94949# initial reimplementation of Bookmarks
2009-04-21 15:40:02 +00:00
|
|
|
_DelBookmarks(rPam.GetMark()->nNode, rPam.GetPoint()->nNode);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint() );
|
|
|
|
nSetPos = pHistory ? pHistory->Count() : 0;
|
|
|
|
|
|
|
|
pHistory->Move( nSetPos, &aHstr );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( bDelFullPara )
|
|
|
|
{
|
|
|
|
ASSERT( rPam.HasMark(), "PaM ohne Mark" );
|
|
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint(),
|
2007-09-27 08:30:29 +00:00
|
|
|
DelCntntType(nsDelCntntType::DELCNT_ALL | nsDelCntntType::DELCNT_CHKNOCNTNT) );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
_DelBookmarks( rPam.GetMark()->nNode, rPam.GetPoint()->nNode );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
DelCntntIndex( *rPam.GetMark(), *rPam.GetPoint() );
|
|
|
|
nSetPos = pHistory ? pHistory->Count() : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !pSttStr && !pEndStr )
|
|
|
|
{
|
2006-03-31 08:52:16 +00:00
|
|
|
SwNodeIndex aSttIdx = ( bDelFullPara || bJoinNext )
|
2000-09-18 23:08:29 +00:00
|
|
|
? rPam.GetMark()->nNode
|
|
|
|
: rPam.GetPoint()->nNode;
|
2006-03-31 08:52:16 +00:00
|
|
|
SwTableNode* pTblNd = aSttIdx.GetNode().GetTableNode();
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pTblNd )
|
|
|
|
{
|
|
|
|
if( bTblDelLastNd )
|
|
|
|
{
|
|
|
|
// dann am Ende wieder einen Node einfuegen
|
|
|
|
const SwNodeIndex aTmpIdx( *pTblNd->EndOfSectionNode(), 1 );
|
|
|
|
rDoc.GetNodes().MakeTxtNode( aTmpIdx,
|
|
|
|
rDoc.GetTxtCollFromPool( RES_POOLCOLL_STANDARD ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
SwCntntNode* pNextNd = rDoc.GetNodes()[
|
|
|
|
pTblNd->EndOfSectionIndex()+1 ]->GetCntntNode();
|
|
|
|
if( pNextNd )
|
|
|
|
{
|
|
|
|
SwFrmFmt* pTableFmt = pTblNd->GetTable().GetFrmFmt();
|
2004-09-08 13:59:07 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
const SfxPoolItem *pItem;
|
|
|
|
if( SFX_ITEM_SET == pTableFmt->GetItemState( RES_PAGEDESC,
|
|
|
|
FALSE, &pItem ) )
|
|
|
|
pNextNd->SetAttr( *pItem );
|
|
|
|
|
|
|
|
if( SFX_ITEM_SET == pTableFmt->GetItemState( RES_BREAK,
|
|
|
|
FALSE, &pItem ) )
|
|
|
|
pNextNd->SetAttr( *pItem );
|
|
|
|
}
|
|
|
|
pTblNd->DelFrms();
|
|
|
|
}
|
|
|
|
|
2007-05-25 12:01:43 +00:00
|
|
|
rPam.SetMark();
|
2000-09-18 23:08:29 +00:00
|
|
|
rPam.DeleteMark();
|
2006-03-31 08:52:16 +00:00
|
|
|
|
|
|
|
rDoc.GetNodes().Delete( aSttIdx, nEndNode - nSttNode );
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
// setze den Cursor immer in einen ContentNode !!
|
|
|
|
if( !rPam.Move( fnMoveBackward, fnGoCntnt ) &&
|
|
|
|
!rPam.Move( fnMoveForward, fnGoCntnt ) )
|
|
|
|
rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
|
|
|
|
}
|
|
|
|
else if( bDelFullPara )
|
|
|
|
{
|
|
|
|
// der Pam wurde am Point( == Ende) um eins erhoeht, um einen
|
|
|
|
// Bereich fuers Undo zu haben. Der muss jetzt aber wieder entfernt
|
|
|
|
// werden!!!
|
|
|
|
rPam.End()->nNode--;
|
|
|
|
if( rPam.GetPoint()->nNode == rPam.GetMark()->nNode )
|
|
|
|
*rPam.GetMark() = *rPam.GetPoint();
|
|
|
|
rDoc.DelFullPara( rPam );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
rDoc.DeleteAndJoin( rPam );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwUndoDelete::Repeat( SwUndoIter& rUndoIter )
|
|
|
|
{
|
|
|
|
if( UNDO_DELETE == rUndoIter.GetLastUndoId() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
SwPaM& rPam = *rUndoIter.pAktPam;
|
|
|
|
SwDoc& rDoc = *rPam.GetDoc();
|
|
|
|
BOOL bGroupUndo = rDoc.DoesGroupUndo();
|
|
|
|
rDoc.DoGroupUndo( FALSE );
|
|
|
|
if( !rPam.HasMark() )
|
|
|
|
{
|
|
|
|
rPam.SetMark();
|
|
|
|
rPam.Move( fnMoveForward, fnGoCntnt );
|
|
|
|
}
|
|
|
|
if( bDelFullPara )
|
|
|
|
rDoc.DelFullPara( rPam );
|
|
|
|
else
|
|
|
|
rDoc.DeleteAndJoin( rPam );
|
|
|
|
rDoc.DoGroupUndo( bGroupUndo );
|
|
|
|
rUndoIter.pLastUndoObj = this;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-09-08 13:59:07 +00:00
|
|
|
void SwUndoDelete::SetTableName(const String & rName)
|
|
|
|
{
|
|
|
|
sTableName = rName;
|
|
|
|
}
|