xref: /aoo42x/main/sw/source/core/edit/eddel.cxx (revision 23d8f725)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19efeef26fSAndrew Rist  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <hintids.hxx>
29cdf0e10cSrcweir #include <doc.hxx>
30cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
31cdf0e10cSrcweir #include <editsh.hxx>
32cdf0e10cSrcweir #include <cntfrm.hxx>
33cdf0e10cSrcweir #include <pam.hxx>
34cdf0e10cSrcweir #include <swundo.hxx>		// fuer die UndoIds
35cdf0e10cSrcweir #include <edimp.hxx>
36cdf0e10cSrcweir #include <IMark.hxx>
37cdf0e10cSrcweir #include <docary.hxx>
38cdf0e10cSrcweir #include <SwRewriter.hxx>
39cdf0e10cSrcweir #include <globals.hrc>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #include <comcore.hrc>
42cdf0e10cSrcweir #include <list>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir /************************************************************
45cdf0e10cSrcweir  * Loeschen
46cdf0e10cSrcweir  ************************************************************/
47cdf0e10cSrcweir 
DeleteSel(SwPaM & rPam,sal_Bool * pUndo)48cdf0e10cSrcweir void SwEditShell::DeleteSel( SwPaM& rPam, sal_Bool* pUndo )
49cdf0e10cSrcweir {
50d1b67b9fSOliver-Rainer Wittmann     // only on a selection
51d1b67b9fSOliver-Rainer Wittmann     if ( !rPam.HasMark() || *rPam.GetPoint() == *rPam.GetMark())
52d1b67b9fSOliver-Rainer Wittmann         return;
53cdf0e10cSrcweir 
54d1b67b9fSOliver-Rainer Wittmann     // besteht eine Selection in einer Tabelle ?
55d1b67b9fSOliver-Rainer Wittmann     // dann nur den Inhalt der selektierten Boxen loeschen
56d1b67b9fSOliver-Rainer Wittmann     // jetzt gibt es 2 Faelle die beachtet werden muessen:
57d1b67b9fSOliver-Rainer Wittmann     //	1. Point und Mark stehen in einer Box, Selection normal loeschen
58d1b67b9fSOliver-Rainer Wittmann     //	2. Point und Mark stehen in unterschiedlichen Boxen, alle
59d1b67b9fSOliver-Rainer Wittmann     // selektierten Boxen suchen in den Inhalt loeschen
60a64e4662SJian Hong Cheng 
61d1b67b9fSOliver-Rainer Wittmann     if( rPam.GetNode()->FindTableNode() &&
62d1b67b9fSOliver-Rainer Wittmann         rPam.GetNode()->StartOfSectionNode() != rPam.GetNode(sal_False)->StartOfSectionNode() )
63d1b67b9fSOliver-Rainer Wittmann     {
64d1b67b9fSOliver-Rainer Wittmann         // in Tabellen das Undo gruppieren
65d1b67b9fSOliver-Rainer Wittmann         if( pUndo && !*pUndo )
66cdf0e10cSrcweir         {
67cdf0e10cSrcweir             GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
68d1b67b9fSOliver-Rainer Wittmann             *pUndo = sal_True;
69d1b67b9fSOliver-Rainer Wittmann         }
70d1b67b9fSOliver-Rainer Wittmann         SwPaM aDelPam( *rPam.Start() );
71d1b67b9fSOliver-Rainer Wittmann         const SwPosition* pEndSelPos = rPam.End();
72d1b67b9fSOliver-Rainer Wittmann         do {
73d1b67b9fSOliver-Rainer Wittmann             aDelPam.SetMark();
74d1b67b9fSOliver-Rainer Wittmann             SwNode* pNd = aDelPam.GetNode();
75d1b67b9fSOliver-Rainer Wittmann             const SwNode& rEndNd = *pNd->EndOfSectionNode();
76d1b67b9fSOliver-Rainer Wittmann             if( pEndSelPos->nNode.GetIndex() <= rEndNd.GetIndex() )
77d1b67b9fSOliver-Rainer Wittmann             {
78d1b67b9fSOliver-Rainer Wittmann                 *aDelPam.GetPoint() = *pEndSelPos;
79d1b67b9fSOliver-Rainer Wittmann                 pEndSelPos = 0;		// Pointer als Flag missbrauchen
80d1b67b9fSOliver-Rainer Wittmann             }
81d1b67b9fSOliver-Rainer Wittmann             else
82d1b67b9fSOliver-Rainer Wittmann             {
83d1b67b9fSOliver-Rainer Wittmann                 // dann ans Ende der Section
84d1b67b9fSOliver-Rainer Wittmann                 aDelPam.GetPoint()->nNode = rEndNd;
85d1b67b9fSOliver-Rainer Wittmann                 aDelPam.Move( fnMoveBackward, fnGoCntnt );
86d1b67b9fSOliver-Rainer Wittmann             }
87d1b67b9fSOliver-Rainer Wittmann             // geschuetze Boxen ueberspringen !
88d1b67b9fSOliver-Rainer Wittmann             //For i117395, in some situation, the node would be hidden or invisible, which makes the frame of it unavailable
89d1b67b9fSOliver-Rainer Wittmann             //So verify it before use it.
90d1b67b9fSOliver-Rainer Wittmann             SwCntntFrm* pFrm = NULL;
91d1b67b9fSOliver-Rainer Wittmann             if( !pNd->IsCntntNode() ||
92d1b67b9fSOliver-Rainer Wittmann                 !((pFrm=((SwCntntNode*)pNd)->getLayoutFrm( GetLayout() ))!=NULL && pFrm->IsProtected()) )
93d1b67b9fSOliver-Rainer Wittmann             {
94d1b67b9fSOliver-Rainer Wittmann                 // alles loeschen
95d1b67b9fSOliver-Rainer Wittmann                 GetDoc()->DeleteAndJoin( aDelPam );
96d1b67b9fSOliver-Rainer Wittmann                 SaveTblBoxCntnt( aDelPam.GetPoint() );
97d1b67b9fSOliver-Rainer Wittmann             }
98cdf0e10cSrcweir 
99d1b67b9fSOliver-Rainer Wittmann             if( !pEndSelPos )				// am Ende der Selection
100d1b67b9fSOliver-Rainer Wittmann                 break;
101d1b67b9fSOliver-Rainer Wittmann             aDelPam.DeleteMark();
102d1b67b9fSOliver-Rainer Wittmann             aDelPam.Move( fnMoveForward, fnGoCntnt );	// naechste Box
103d1b67b9fSOliver-Rainer Wittmann         } while( pEndSelPos );
104d1b67b9fSOliver-Rainer Wittmann     }
105d1b67b9fSOliver-Rainer Wittmann     else
106d1b67b9fSOliver-Rainer Wittmann     {
107d1b67b9fSOliver-Rainer Wittmann         // alles loeschen
108d1b67b9fSOliver-Rainer Wittmann         GetDoc()->DeleteAndJoin( rPam );
109d1b67b9fSOliver-Rainer Wittmann         SaveTblBoxCntnt( rPam.GetPoint() );
110d1b67b9fSOliver-Rainer Wittmann     }
111cdf0e10cSrcweir 
112d1b67b9fSOliver-Rainer Wittmann     // Selection wird nicht mehr benoetigt.
113d1b67b9fSOliver-Rainer Wittmann     rPam.DeleteMark();
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir 
Delete()117cdf0e10cSrcweir long SwEditShell::Delete()
118cdf0e10cSrcweir {
119cdf0e10cSrcweir 	SET_CURR_SHELL( this );
120cdf0e10cSrcweir 	long nRet = 0;
121*23d8f725SOliver-Rainer Wittmann 	if ( !HasReadonlySel() || CrsrInsideInputFld() )
122cdf0e10cSrcweir 	{
123cdf0e10cSrcweir 		StartAllAction();
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 		sal_Bool bUndo = GetCrsr()->GetNext() != GetCrsr();
126cdf0e10cSrcweir 		if( bUndo )     // mehr als eine Selection ?
127cdf0e10cSrcweir         {
128cdf0e10cSrcweir             SwRewriter aRewriter;
129cdf0e10cSrcweir             aRewriter.AddRule(UNDO_ARG1, String(SW_RES(STR_MULTISEL)));
130cdf0e10cSrcweir 
131cdf0e10cSrcweir             GetDoc()->GetIDocumentUndoRedo().StartUndo(UNDO_DELETE, &aRewriter);
132cdf0e10cSrcweir         }
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 		FOREACHPAM_START(this)
135cdf0e10cSrcweir 			DeleteSel( *PCURCRSR, &bUndo );
136cdf0e10cSrcweir 		FOREACHPAM_END()
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 		// falls eine Undo-Klammerung, dann hier beenden
139cdf0e10cSrcweir 		if( bUndo )
140cdf0e10cSrcweir         {
141cdf0e10cSrcweir             GetDoc()->GetIDocumentUndoRedo().EndUndo(UNDO_END, 0);
142cdf0e10cSrcweir         }
143cdf0e10cSrcweir 		EndAllAction();
144cdf0e10cSrcweir 		nRet = 1;
145cdf0e10cSrcweir 	}
146cdf0e10cSrcweir 	return nRet;
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
Copy(SwEditShell * pDestShell)149cdf0e10cSrcweir long SwEditShell::Copy( SwEditShell* pDestShell )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir 	if( !pDestShell )
152cdf0e10cSrcweir 		pDestShell = this;
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 	SET_CURR_SHELL( pDestShell );
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 	// List of insert positions for smart insert of block selections
157cdf0e10cSrcweir 	std::list< boost::shared_ptr<SwPosition> > aInsertList;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 	// Fill list of insert positions
160cdf0e10cSrcweir 	{
161cdf0e10cSrcweir 		SwPosition * pPos = 0;
162cdf0e10cSrcweir 		boost::shared_ptr<SwPosition> pInsertPos;
163cdf0e10cSrcweir 		sal_uInt16 nMove = 0;
164cdf0e10cSrcweir 		FOREACHPAM_START(this)
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 			if( !pPos )
167cdf0e10cSrcweir 			{
168cdf0e10cSrcweir 				if( pDestShell == this )
169cdf0e10cSrcweir 				{
170cdf0e10cSrcweir 					// First cursor represents the target position!!
171cdf0e10cSrcweir 					PCURCRSR->DeleteMark();
172cdf0e10cSrcweir 					pPos = (SwPosition*)PCURCRSR->GetPoint();
173cdf0e10cSrcweir 					continue;
174cdf0e10cSrcweir 				}
175cdf0e10cSrcweir 				else
176cdf0e10cSrcweir 					pPos = pDestShell->GetCrsr()->GetPoint();
177cdf0e10cSrcweir 			}
178cdf0e10cSrcweir 			if( IsBlockMode() )
179cdf0e10cSrcweir 			{	// In block mode different insert positions will be calculated
180cdf0e10cSrcweir 				// by simulated cursor movements from the given first insert position
181cdf0e10cSrcweir 				if( nMove )
182cdf0e10cSrcweir 				{
183cdf0e10cSrcweir 					SwCursor aCrsr( *pPos, 0, false);
184cdf0e10cSrcweir 					if( aCrsr.UpDown( sal_False, nMove, 0, 0 ) )
185cdf0e10cSrcweir 					{
186cdf0e10cSrcweir 						pInsertPos.reset( new SwPosition( *aCrsr.GetPoint() ) );
187cdf0e10cSrcweir 						aInsertList.push_back( pInsertPos );
188cdf0e10cSrcweir 					}
189cdf0e10cSrcweir 				}
190cdf0e10cSrcweir 				else
191cdf0e10cSrcweir 					pInsertPos.reset( new SwPosition( *pPos ) );
192cdf0e10cSrcweir 				++nMove;
193cdf0e10cSrcweir 			}
194cdf0e10cSrcweir 			SwPosition *pTmp = IsBlockMode() ? pInsertPos.get() : pPos;
195cdf0e10cSrcweir 			// Check if a selection would be copied into itself
196cdf0e10cSrcweir 			if( pDestShell->GetDoc() == GetDoc() &&
197cdf0e10cSrcweir 				*PCURCRSR->Start() <= *pTmp && *pTmp < *PCURCRSR->End() )
198cdf0e10cSrcweir 				return sal_False;
199cdf0e10cSrcweir 		FOREACHPAM_END()
200cdf0e10cSrcweir 	}
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	pDestShell->StartAllAction();
203cdf0e10cSrcweir 	SwPosition *pPos = 0;
204cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
205cdf0e10cSrcweir 	sal_Bool bFirstMove = sal_True;
206cdf0e10cSrcweir 	SwNodeIndex aSttNdIdx( pDestShell->GetDoc()->GetNodes() );
207cdf0e10cSrcweir 	xub_StrLen nSttCntIdx = 0;
208cdf0e10cSrcweir 	// For block selection this list is filled with the insert positions
209cdf0e10cSrcweir 	std::list< boost::shared_ptr<SwPosition> >::iterator pNextInsert = aInsertList.begin();
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     pDestShell->GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
212cdf0e10cSrcweir 	FOREACHPAM_START(this)
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 		if( !pPos )
215cdf0e10cSrcweir 		{
216cdf0e10cSrcweir 			if( pDestShell == this )
217cdf0e10cSrcweir 			{
218cdf0e10cSrcweir 				// First cursor represents the target position!!
219cdf0e10cSrcweir 				PCURCRSR->DeleteMark();
220cdf0e10cSrcweir 				pPos = (SwPosition*)PCURCRSR->GetPoint();
221cdf0e10cSrcweir 				continue;
222cdf0e10cSrcweir 			}
223cdf0e10cSrcweir 			else
224cdf0e10cSrcweir 				pPos = pDestShell->GetCrsr()->GetPoint();
225cdf0e10cSrcweir 		}
226cdf0e10cSrcweir 		if( !bFirstMove )
227cdf0e10cSrcweir 		{
228cdf0e10cSrcweir 			if( pNextInsert != aInsertList.end() )
229cdf0e10cSrcweir 			{
230cdf0e10cSrcweir 				pPos = pNextInsert->get();
231cdf0e10cSrcweir 				++pNextInsert;
232cdf0e10cSrcweir 			}
233cdf0e10cSrcweir 			else if( IsBlockMode() )
234cdf0e10cSrcweir 				GetDoc()->SplitNode( *pPos, false );
235cdf0e10cSrcweir 		}
236cdf0e10cSrcweir 
237cdf0e10cSrcweir 		// nur bei Selektion (nicht Textnodes haben Selection,
238cdf0e10cSrcweir 		// aber Point/GetMark sind gleich
239cdf0e10cSrcweir 		if( !PCURCRSR->HasMark() || *PCURCRSR->GetPoint() == *PCURCRSR->GetMark() )
240cdf0e10cSrcweir 			continue;
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 		if( bFirstMove )
243cdf0e10cSrcweir 		{
244cdf0e10cSrcweir 			// Anfangs-Position vom neuen Bereich merken
245cdf0e10cSrcweir 			aSttNdIdx = pPos->nNode.GetIndex()-1;
246cdf0e10cSrcweir 			nSttCntIdx = pPos->nContent.GetIndex();
247cdf0e10cSrcweir 			bFirstMove = sal_False;
248cdf0e10cSrcweir 		}
249cdf0e10cSrcweir 
250cdf0e10cSrcweir         const bool bSuccess( GetDoc()->CopyRange( *PCURCRSR, *pPos, false ) );
251cdf0e10cSrcweir         if (!bSuccess)
252cdf0e10cSrcweir 			continue;
253cdf0e10cSrcweir 
254cdf0e10cSrcweir         SwPaM aInsertPaM(*pPos, SwPosition(aSttNdIdx));
255cdf0e10cSrcweir         pDestShell->GetDoc()->MakeUniqueNumRules(aInsertPaM);
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 		bRet = sal_True;
258cdf0e10cSrcweir 	FOREACHPAM_END()
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 	// Maybe nothing has been moved?
262cdf0e10cSrcweir 	if( !bFirstMove )
263cdf0e10cSrcweir 	{
264cdf0e10cSrcweir 		SwPaM* pCrsr = pDestShell->GetCrsr();
265cdf0e10cSrcweir 		pCrsr->SetMark();
266cdf0e10cSrcweir 		pCrsr->GetPoint()->nNode = aSttNdIdx.GetIndex()+1;
267cdf0e10cSrcweir 		pCrsr->GetPoint()->nContent.Assign( pCrsr->GetCntntNode(),nSttCntIdx);
268cdf0e10cSrcweir 		pCrsr->Exchange();
269cdf0e10cSrcweir 	}
270cdf0e10cSrcweir 	else
271cdf0e10cSrcweir 	{
272cdf0e10cSrcweir 		// falls beim Move der Cursor "gewandert" ist, so setze hier auch
273cdf0e10cSrcweir 		// seinen GetMark um, damit dieser nie in den Wald zeigt.
274cdf0e10cSrcweir 		pDestShell->GetCrsr()->SetMark();
275cdf0e10cSrcweir 		pDestShell->GetCrsr()->DeleteMark();
276cdf0e10cSrcweir 	}
277cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
278cdf0e10cSrcweir // pruefe ob die Indizies auch in den richtigen Nodes angemeldet sind
279cdf0e10cSrcweir {
280cdf0e10cSrcweir 	SwPaM* pCmp = (SwPaM*)pDestShell->GetCrsr();        // sicher den Pointer auf Cursor
281cdf0e10cSrcweir 	do {
282cdf0e10cSrcweir 		ASSERT( pCmp->GetPoint()->nContent.GetIdxReg()
283cdf0e10cSrcweir 					== pCmp->GetCntntNode(), "Point im falschen Node" );
284cdf0e10cSrcweir 		ASSERT( pCmp->GetMark()->nContent.GetIdxReg()
285cdf0e10cSrcweir 					== pCmp->GetCntntNode(sal_False), "Mark im falschen Node" );
286cdf0e10cSrcweir 		sal_Bool bTst = *pCmp->GetPoint() == *pCmp->GetMark();
287cdf0e10cSrcweir         (void) bTst;
288cdf0e10cSrcweir 	} while( pDestShell->GetCrsr() != ( pCmp = (SwPaM*)pCmp->GetNext() ) );
289cdf0e10cSrcweir }
290cdf0e10cSrcweir #endif
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 	// Undo-Klammerung hier beenden
293cdf0e10cSrcweir     pDestShell->GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
294cdf0e10cSrcweir 	pDestShell->EndAllAction();
295cdf0e10cSrcweir 
296cdf0e10cSrcweir 	pDestShell->SaveTblBoxCntnt( pDestShell->GetCrsr()->GetPoint() );
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 	return (long)bRet;
299cdf0e10cSrcweir }
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 	// Ersetz einen selektierten Bereich in einem TextNode mit dem
303cdf0e10cSrcweir 	// String. Ist fuers Suchen&Ersetzen gedacht.
304cdf0e10cSrcweir 	// bRegExpRplc - ersetze Tabs (\\t) und setze den gefundenen String
305cdf0e10cSrcweir 	//				 ein ( nicht \& )
306cdf0e10cSrcweir 	// 				z.B.: Fnd: "zzz", Repl: "xx\t\\t..&..\&"
307cdf0e10cSrcweir 	//						--> "xx\t<Tab>..zzz..&"
Replace(const String & rNewStr,sal_Bool bRegExpRplc)308cdf0e10cSrcweir sal_Bool SwEditShell::Replace( const String& rNewStr, sal_Bool bRegExpRplc )
309cdf0e10cSrcweir {
310cdf0e10cSrcweir 	SET_CURR_SHELL( this );
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
313cdf0e10cSrcweir 	if( !HasReadonlySel() )
314cdf0e10cSrcweir 	{
315cdf0e10cSrcweir 		StartAllAction();
316cdf0e10cSrcweir         GetDoc()->GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL);
317cdf0e10cSrcweir 
318cdf0e10cSrcweir 		FOREACHPAM_START(this)
319cdf0e10cSrcweir 			if( PCURCRSR->HasMark() && *PCURCRSR->GetMark() != *PCURCRSR->GetPoint() )
320cdf0e10cSrcweir 			{
321cdf0e10cSrcweir                 bRet = GetDoc()->ReplaceRange( *PCURCRSR, rNewStr, bRegExpRplc )
322cdf0e10cSrcweir                     || bRet;
323cdf0e10cSrcweir 				SaveTblBoxCntnt( PCURCRSR->GetPoint() );
324cdf0e10cSrcweir 			}
325cdf0e10cSrcweir 		FOREACHPAM_END()
326cdf0e10cSrcweir 
327cdf0e10cSrcweir 		// Undo-Klammerung hier beenden
328cdf0e10cSrcweir         GetDoc()->GetIDocumentUndoRedo().EndUndo(UNDO_EMPTY, NULL);
329cdf0e10cSrcweir 		EndAllAction();
330cdf0e10cSrcweir 	}
331cdf0e10cSrcweir 	return bRet;
332cdf0e10cSrcweir }
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 	// Special-Methode fuer JOE's- Wizzards
DelFullPara()336cdf0e10cSrcweir sal_Bool SwEditShell::DelFullPara()
337cdf0e10cSrcweir {
338cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
339cdf0e10cSrcweir 	if( !IsTableMode() )
340cdf0e10cSrcweir 	{
341cdf0e10cSrcweir 		SwPaM* pCrsr = GetCrsr();
342cdf0e10cSrcweir 		// keine Mehrfach-Selection
343cdf0e10cSrcweir 		if( pCrsr->GetNext() == pCrsr && !HasReadonlySel() )
344cdf0e10cSrcweir 		{
345cdf0e10cSrcweir 			SET_CURR_SHELL( this );
346cdf0e10cSrcweir 			StartAllAction();
347cdf0e10cSrcweir 			bRet = GetDoc()->DelFullPara( *pCrsr );
348cdf0e10cSrcweir 			EndAllAction();
349cdf0e10cSrcweir 		}
350cdf0e10cSrcweir 	}
351cdf0e10cSrcweir 	return bRet;
352cdf0e10cSrcweir }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 
356