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