xref: /trunk/main/sc/source/ui/undo/undoblk3.cxx (revision 8f080d45)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 // INCLUDE -------------------------------------------------------------------
28 
29 #include "scitems.hxx"
30 #include <editeng/boxitem.hxx>
31 #include <svl/srchitem.hxx>
32 #include <sfx2/linkmgr.hxx>
33 #include <sfx2/bindings.hxx>
34 #include <vcl/virdev.hxx>
35 #include <sfx2/app.hxx>
36 
37 #include "undoblk.hxx"
38 #include "sc.hrc"
39 #include "globstr.hrc"
40 #include "global.hxx"
41 #include "rangenam.hxx"
42 #include "arealink.hxx"
43 #include "patattr.hxx"
44 #include "target.hxx"
45 #include "document.hxx"
46 #include "docpool.hxx"
47 #include "table.hxx"
48 #include "docsh.hxx"
49 #include "tabvwsh.hxx"
50 #include "undoolk.hxx"
51 #include "undoutil.hxx"
52 #include "chgtrack.hxx"
53 #include "dociter.hxx"
54 #include "cell.hxx"
55 #include "paramisc.hxx"
56 #include "postit.hxx"
57 #include "docuno.hxx"
58 
59 // STATIC DATA ---------------------------------------------------------------
60 
61 TYPEINIT1(ScUndoDeleteContents, 	SfxUndoAction);
62 TYPEINIT1(ScUndoFillTable,		 	SfxUndoAction);
63 TYPEINIT1(ScUndoSelectionAttr,		SfxUndoAction);
64 TYPEINIT1(ScUndoAutoFill,			SfxUndoAction);
65 TYPEINIT1(ScUndoMerge,				SfxUndoAction);
66 TYPEINIT1(ScUndoAutoFormat, 		SfxUndoAction);
67 TYPEINIT1(ScUndoReplace,			SfxUndoAction);
68 TYPEINIT1(ScUndoTabOp,				SfxUndoAction);
69 TYPEINIT1(ScUndoConversion,         SfxUndoAction);
70 TYPEINIT1(ScUndoRefConversion,      SfxUndoAction);
71 TYPEINIT1(ScUndoRefreshLink,		SfxUndoAction);
72 TYPEINIT1(ScUndoInsertAreaLink,		SfxUndoAction);
73 TYPEINIT1(ScUndoRemoveAreaLink,		SfxUndoAction);
74 TYPEINIT1(ScUndoUpdateAreaLink,		SfxUndoAction);
75 
76 
77 // To Do:
78 /*A*/	// SetOptimalHeight auf Dokument, wenn keine View
79 
80 
81 //============================================================================
82 //	class ScUndoDeleteContents
83 //
84 //	Inhalte loeschen
85 
86 //----------------------------------------------------------------------------
87 
ScUndoDeleteContents(ScDocShell * pNewDocShell,const ScMarkData & rMark,const ScRange & rRange,ScDocument * pNewUndoDoc,sal_Bool bNewMulti,sal_uInt16 nNewFlags,sal_Bool bObjects)88 ScUndoDeleteContents::ScUndoDeleteContents(
89 				ScDocShell* pNewDocShell,
90 				const ScMarkData& rMark, const ScRange& rRange,
91 				ScDocument* pNewUndoDoc, sal_Bool bNewMulti,
92 				sal_uInt16 nNewFlags, sal_Bool bObjects )
93 		//
94 	:	ScSimpleUndo( pNewDocShell ),
95 		//
96 		aRange		( rRange ),
97 		aMarkData	( rMark ),
98 		pUndoDoc	( pNewUndoDoc ),
99 		pDrawUndo	( NULL ),
100 		nFlags		( nNewFlags ),
101 		bMulti		( bNewMulti )	// ueberliquid
102 {
103 	if (bObjects)
104 		pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
105 
106 	if ( !(aMarkData.IsMarked() || aMarkData.IsMultiMarked()) )		// keine Zelle markiert:
107 		aMarkData.SetMarkArea( aRange );							// Zelle unter Cursor markieren
108 
109 	SetChangeTrack();
110 }
111 
112 
113 //----------------------------------------------------------------------------
114 
~ScUndoDeleteContents()115 __EXPORT ScUndoDeleteContents::~ScUndoDeleteContents()
116 {
117 	delete pUndoDoc;
118 	DeleteSdrUndoAction( pDrawUndo );
119 }
120 
121 
122 //----------------------------------------------------------------------------
123 
GetComment() const124 String __EXPORT ScUndoDeleteContents::GetComment() const
125 {
126 	return ScGlobal::GetRscString( STR_UNDO_DELETECONTENTS );	 // "Loeschen"
127 }
128 
129 
SetChangeTrack()130 void ScUndoDeleteContents::SetChangeTrack()
131 {
132 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
133 	if ( pChangeTrack && (nFlags & IDF_CONTENTS) )
134 		pChangeTrack->AppendContentRange( aRange, pUndoDoc,
135 			nStartChangeAction, nEndChangeAction );
136 	else
137 		nStartChangeAction = nEndChangeAction = 0;
138 }
139 
140 
141 //----------------------------------------------------------------------------
142 
DoChange(const sal_Bool bUndo)143 void ScUndoDeleteContents::DoChange( const sal_Bool bUndo )
144 {
145 	ScDocument* pDoc = pDocShell->GetDocument();
146 
147 	SetViewMarkData( aMarkData );
148 
149 	sal_uInt16 nExtFlags = 0;
150 
151 	if (bUndo)	// nur Undo
152 	{
153 		sal_uInt16 nUndoFlags = IDF_NONE;		//	entweder alle oder keine Inhalte kopieren
154 		if (nFlags & IDF_CONTENTS)			//	(es sind nur die richtigen ins UndoDoc kopiert worden)
155 			nUndoFlags |= IDF_CONTENTS;
156 		if (nFlags & IDF_ATTRIB)
157 			nUndoFlags |= IDF_ATTRIB;
158 		if (nFlags & IDF_EDITATTR)			// Edit-Engine-Attribute
159 			nUndoFlags |= IDF_STRING;		// -> Zellen werden geaendert
160         // do not create clones of note captions, they will be restored via drawing undo
161         nUndoFlags |= IDF_NOCAPTIONS;
162 
163 		ScRange aCopyRange = aRange;
164 		SCTAB nTabCount = pDoc->GetTableCount();
165 		aCopyRange.aStart.SetTab(0);
166 		aCopyRange.aEnd.SetTab(nTabCount-1);
167 
168 		pUndoDoc->CopyToDocument( aCopyRange, nUndoFlags, bMulti, pDoc, &aMarkData );
169 
170         DoSdrUndoAction( pDrawUndo, pDoc );
171 
172 		ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
173 		if ( pChangeTrack )
174 			pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
175 
176 		pDocShell->UpdatePaintExt( nExtFlags, aRange );				// content after the change
177 	}
178 	else		// nur Redo
179 	{
180 		pDocShell->UpdatePaintExt( nExtFlags, aRange );				// content before the change
181 
182 		aMarkData.MarkToMulti();
183         RedoSdrUndoAction( pDrawUndo );
184         // do not delete objects and note captions, they have been removed via drawing undo
185         sal_uInt16 nRedoFlags = (nFlags & ~IDF_OBJECTS) | IDF_NOCAPTIONS;
186         pDoc->DeleteSelection( nRedoFlags, aMarkData );
187 		aMarkData.MarkToSimple();
188 
189 		SetChangeTrack();
190 	}
191 
192 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
193 	if ( !( (pViewShell) && pViewShell->AdjustRowHeight(
194 								aRange.aStart.Row(), aRange.aEnd.Row() ) ) )
195 /*A*/	pDocShell->PostPaint( aRange, PAINT_GRID | PAINT_EXTRAS, nExtFlags );
196 
197 	pDocShell->PostDataChanged();
198 	if (pViewShell)
199 		pViewShell->CellContentChanged();
200 
201 	ShowTable( aRange );
202 }
203 
204 
205 //----------------------------------------------------------------------------
206 
Undo()207 void __EXPORT ScUndoDeleteContents::Undo()
208 {
209 	BeginUndo();
210 	DoChange( sal_True );
211 	EndUndo();
212 
213     // #i97876# Spreadsheet data changes are not notified
214     ScModelObj* pModelObj = ScModelObj::getImplementation( pDocShell->GetModel() );
215     if ( pModelObj && pModelObj->HasChangesListeners() )
216     {
217         ScRangeList aChangeRanges;
218         aChangeRanges.Append( aRange );
219         pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
220     }
221 }
222 
223 
224 //----------------------------------------------------------------------------
225 
Redo()226 void __EXPORT ScUndoDeleteContents::Redo()
227 {
228 	BeginRedo();
229 	DoChange( sal_False );
230 	EndRedo();
231 
232     // #i97876# Spreadsheet data changes are not notified
233     ScModelObj* pModelObj = ScModelObj::getImplementation( pDocShell->GetModel() );
234     if ( pModelObj && pModelObj->HasChangesListeners() )
235     {
236         ScRangeList aChangeRanges;
237         aChangeRanges.Append( aRange );
238         pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
239     }
240 }
241 
242 
243 //----------------------------------------------------------------------------
244 
Repeat(SfxRepeatTarget & rTarget)245 void __EXPORT ScUndoDeleteContents::Repeat(SfxRepeatTarget& rTarget)
246 {
247 	if (rTarget.ISA(ScTabViewTarget))
248 		((ScTabViewTarget&)rTarget).GetViewShell()->DeleteContents( nFlags, sal_True );
249 }
250 
251 
252 //----------------------------------------------------------------------------
253 
CanRepeat(SfxRepeatTarget & rTarget) const254 sal_Bool __EXPORT ScUndoDeleteContents::CanRepeat(SfxRepeatTarget& rTarget) const
255 {
256 	return (rTarget.ISA(ScTabViewTarget));
257 }
258 
259 
260 //============================================================================
261 //	class ScUndoFillTable
262 //
263 //	Tabellen ausfuellen
264 //	(Bearbeiten|Ausfuellen|...)
265 
266 //----------------------------------------------------------------------------
267 
ScUndoFillTable(ScDocShell * pNewDocShell,const ScMarkData & rMark,SCCOL nStartX,SCROW nStartY,SCTAB nStartZ,SCCOL nEndX,SCROW nEndY,SCTAB nEndZ,ScDocument * pNewUndoDoc,sal_Bool bNewMulti,SCTAB nSrc,sal_uInt16 nFlg,sal_uInt16 nFunc,sal_Bool bSkip,sal_Bool bLink)268 ScUndoFillTable::ScUndoFillTable( ScDocShell* pNewDocShell,
269 				const ScMarkData& rMark,
270 				SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
271 				SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
272 				ScDocument* pNewUndoDoc, sal_Bool bNewMulti, SCTAB nSrc,
273 				sal_uInt16 nFlg, sal_uInt16 nFunc, sal_Bool bSkip, sal_Bool bLink )
274 		//
275 	:	ScSimpleUndo( pNewDocShell ),
276 		//
277 		aRange		( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ),
278 		aMarkData	( rMark ),
279 		pUndoDoc	( pNewUndoDoc ),
280 		nFlags		( nFlg ),
281 		nFunction	( nFunc ),
282 		nSrcTab		( nSrc ),
283 		bMulti		( bNewMulti ),
284 		bSkipEmpty	( bSkip ),
285 		bAsLink		( bLink )
286 {
287 	SetChangeTrack();
288 }
289 
290 
291 //----------------------------------------------------------------------------
292 
~ScUndoFillTable()293 __EXPORT ScUndoFillTable::~ScUndoFillTable()
294 {
295 	delete pUndoDoc;
296 }
297 
298 
299 //----------------------------------------------------------------------------
300 
GetComment() const301 String __EXPORT ScUndoFillTable::GetComment() const
302 {
303 	return ScGlobal::GetRscString( STR_FILL_TAB );
304 }
305 
306 
SetChangeTrack()307 void ScUndoFillTable::SetChangeTrack()
308 {
309 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
310 	if ( pChangeTrack )
311 	{
312 		SCTAB nTabCount = pDocShell->GetDocument()->GetTableCount();
313 		ScRange aWorkRange(aRange);
314 		nStartChangeAction = 0;
315 		sal_uLong nTmpAction;
316 		for ( SCTAB i = 0; i < nTabCount; i++ )
317 		{
318 			if (i != nSrcTab && aMarkData.GetTableSelect(i))
319 			{
320 				aWorkRange.aStart.SetTab(i);
321 				aWorkRange.aEnd.SetTab(i);
322 				pChangeTrack->AppendContentRange( aWorkRange, pUndoDoc,
323 					nTmpAction, nEndChangeAction );
324 				if ( !nStartChangeAction )
325 					nStartChangeAction = nTmpAction;
326 			}
327 		}
328 	}
329 	else
330 		nStartChangeAction = nEndChangeAction = 0;
331 }
332 
333 
334 //----------------------------------------------------------------------------
335 
DoChange(const sal_Bool bUndo)336 void ScUndoFillTable::DoChange( const sal_Bool bUndo )
337 {
338 	ScDocument* pDoc = pDocShell->GetDocument();
339 
340 	SetViewMarkData( aMarkData );
341 
342 	if (bUndo)	// nur Undo
343 	{
344 		SCTAB nTabCount = pDoc->GetTableCount();
345 		ScRange aWorkRange(aRange);
346 		for ( SCTAB i = 0; i < nTabCount; i++ )
347 			if (i != nSrcTab && aMarkData.GetTableSelect(i))
348 			{
349 				aWorkRange.aStart.SetTab(i);
350 				aWorkRange.aEnd.SetTab(i);
351 				if (bMulti)
352 					pDoc->DeleteSelectionTab( i, IDF_ALL, aMarkData );
353 				else
354 					pDoc->DeleteAreaTab( aWorkRange, IDF_ALL );
355 				pUndoDoc->CopyToDocument( aWorkRange, IDF_ALL, bMulti, pDoc, &aMarkData );
356 			}
357 
358 		ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
359 		if ( pChangeTrack )
360 			pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
361 	}
362 	else		// nur Redo
363 	{
364 		aMarkData.MarkToMulti();
365 		pDoc->FillTabMarked( nSrcTab, aMarkData, nFlags, nFunction, bSkipEmpty, bAsLink );
366 		aMarkData.MarkToSimple();
367 		SetChangeTrack();
368 	}
369 
370 	pDocShell->PostPaint(0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_GRID|PAINT_EXTRAS);
371 	pDocShell->PostDataChanged();
372 
373 	//	CellContentChanged kommt mit der Markierung
374 
375 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
376 	if (pViewShell)
377 	{
378 		SCTAB nTab = pViewShell->GetViewData()->GetTabNo();
379 		if ( !aMarkData.GetTableSelect(nTab) )
380 			pViewShell->SetTabNo( nSrcTab );
381 
382 		pViewShell->DoneBlockMode();	// gibt sonst Probleme, weil Markierung auf falscher Tabelle
383 	}
384 }
385 
386 
387 //----------------------------------------------------------------------------
388 
Undo()389 void __EXPORT ScUndoFillTable::Undo()
390 {
391 	BeginUndo();
392 	DoChange( sal_True );
393 	EndUndo();
394 }
395 
396 
397 //----------------------------------------------------------------------------
398 
Redo()399 void __EXPORT ScUndoFillTable::Redo()
400 {
401 	BeginRedo();
402 	DoChange( sal_False );
403 	EndRedo();
404 }
405 
406 
407 //----------------------------------------------------------------------------
408 
Repeat(SfxRepeatTarget & rTarget)409 void __EXPORT ScUndoFillTable::Repeat(SfxRepeatTarget& rTarget)
410 {
411 	if (rTarget.ISA(ScTabViewTarget))
412 		((ScTabViewTarget&)rTarget).GetViewShell()->FillTab( nFlags, nFunction, bSkipEmpty, bAsLink );
413 }
414 
415 
416 //----------------------------------------------------------------------------
417 
CanRepeat(SfxRepeatTarget & rTarget) const418 sal_Bool __EXPORT ScUndoFillTable::CanRepeat(SfxRepeatTarget& rTarget) const
419 {
420 	return (rTarget.ISA(ScTabViewTarget));
421 }
422 
423 
424 //============================================================================
425 //	class ScUndoSelectionAttr
426 //
427 //	Zellformat aendern
428 
429 //----------------------------------------------------------------------------
430 
ScUndoSelectionAttr(ScDocShell * pNewDocShell,const ScMarkData & rMark,SCCOL nStartX,SCROW nStartY,SCTAB nStartZ,SCCOL nEndX,SCROW nEndY,SCTAB nEndZ,ScDocument * pNewUndoDoc,sal_Bool bNewMulti,const ScPatternAttr * pNewApply,const SvxBoxItem * pNewOuter,const SvxBoxInfoItem * pNewInner)431 ScUndoSelectionAttr::ScUndoSelectionAttr( ScDocShell* pNewDocShell,
432 				const ScMarkData& rMark,
433 				SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
434 				SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
435 				ScDocument* pNewUndoDoc, sal_Bool bNewMulti,
436 				const ScPatternAttr* pNewApply,
437 				const SvxBoxItem* pNewOuter, const SvxBoxInfoItem* pNewInner )
438 		//
439 	:	ScSimpleUndo( pNewDocShell ),
440 		//
441 		aMarkData	( rMark ),
442 		aRange		( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ),
443 		pUndoDoc	( pNewUndoDoc ),
444 		bMulti		( bNewMulti )
445 {
446 	ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool();
447 	pApplyPattern = (ScPatternAttr*) &pPool->Put( *pNewApply );
448 	pLineOuter = pNewOuter ? (SvxBoxItem*) &pPool->Put( *pNewOuter ) : NULL;
449 	pLineInner = pNewInner ? (SvxBoxInfoItem*) &pPool->Put( *pNewInner ) : NULL;
450 }
451 
452 
453 //----------------------------------------------------------------------------
454 
~ScUndoSelectionAttr()455 __EXPORT ScUndoSelectionAttr::~ScUndoSelectionAttr()
456 {
457 	ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool();
458 	pPool->Remove(*pApplyPattern);
459 	if (pLineOuter)
460 		pPool->Remove(*pLineOuter);
461 	if (pLineInner)
462 		pPool->Remove(*pLineInner);
463 
464 	delete pUndoDoc;
465 }
466 
467 
468 //----------------------------------------------------------------------------
469 
GetComment() const470 String __EXPORT ScUndoSelectionAttr::GetComment() const
471 {
472 	//"Attribute" "/Linien"
473 	return ScGlobal::GetRscString( pLineOuter ? STR_UNDO_SELATTRLINES : STR_UNDO_SELATTR );
474 }
475 
476 
477 //----------------------------------------------------------------------------
478 
DoChange(const sal_Bool bUndo)479 void ScUndoSelectionAttr::DoChange( const sal_Bool bUndo )
480 {
481 	ScDocument* pDoc = pDocShell->GetDocument();
482 
483 	SetViewMarkData( aMarkData );
484 
485 	ScRange aEffRange( aRange );
486 	if ( pDoc->HasAttrib( aEffRange, HASATTR_MERGED ) )			// zusammengefasste Zellen?
487 		pDoc->ExtendMerge( aEffRange );
488 
489 	sal_uInt16 nExtFlags = 0;
490 	pDocShell->UpdatePaintExt( nExtFlags, aEffRange );
491 
492 	if (bUndo)	// nur bei Undo
493 	{
494 		ScRange aCopyRange = aRange;
495 		SCTAB nTabCount = pDoc->GetTableCount();
496 		aCopyRange.aStart.SetTab(0);
497 		aCopyRange.aEnd.SetTab(nTabCount-1);
498 		pUndoDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, bMulti, pDoc, &aMarkData );
499 	}
500 	else		// nur bei Redo
501 	{
502 		aMarkData.MarkToMulti();
503 		pDoc->ApplySelectionPattern( *pApplyPattern, aMarkData );
504 		aMarkData.MarkToSimple();
505 
506 		if (pLineOuter)
507 			pDoc->ApplySelectionFrame( aMarkData, pLineOuter, pLineInner );
508 	}
509 
510 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
511 	if ( !( (pViewShell) && pViewShell->AdjustBlockHeight() ) )
512 /*A*/	pDocShell->PostPaint( aEffRange, PAINT_GRID | PAINT_EXTRAS, nExtFlags );
513 
514 	ShowTable( aRange );
515 }
516 
517 
518 //----------------------------------------------------------------------------
519 
Undo()520 void __EXPORT ScUndoSelectionAttr::Undo()
521 {
522 	BeginUndo();
523 	DoChange( sal_True );
524 	EndUndo();
525 }
526 
527 
528 //----------------------------------------------------------------------------
529 
Redo()530 void __EXPORT ScUndoSelectionAttr::Redo()
531 {
532 	BeginRedo();
533 	DoChange( sal_False );
534 	EndRedo();
535 }
536 
537 
538 //----------------------------------------------------------------------------
539 
Repeat(SfxRepeatTarget & rTarget)540 void __EXPORT ScUndoSelectionAttr::Repeat(SfxRepeatTarget& rTarget)
541 {
542 	if (rTarget.ISA(ScTabViewTarget))
543 	{
544 		ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
545 		if (pLineOuter)
546 			rViewShell.ApplyPatternLines( *pApplyPattern, pLineOuter, pLineInner, sal_True );
547 		else
548 			rViewShell.ApplySelectionPattern( *pApplyPattern, sal_True );
549 	}
550 }
551 
552 
553 //----------------------------------------------------------------------------
554 
CanRepeat(SfxRepeatTarget & rTarget) const555 sal_Bool __EXPORT ScUndoSelectionAttr::CanRepeat(SfxRepeatTarget& rTarget) const
556 {
557 	return (rTarget.ISA(ScTabViewTarget));
558 }
559 
560 
561 //============================================================================
562 //	class ScUndoAutoFill
563 //
564 //	Auto-Fill (nur einfache Bloecke)
565 
566 //----------------------------------------------------------------------------
567 
ScUndoAutoFill(ScDocShell * pNewDocShell,const ScRange & rRange,const ScRange & rSourceArea,ScDocument * pNewUndoDoc,const ScMarkData & rMark,FillDir eNewFillDir,FillCmd eNewFillCmd,FillDateCmd eNewFillDateCmd,double fNewStartValue,double fNewStepValue,double fNewMaxValue,sal_uInt16 nMaxShIndex)568 ScUndoAutoFill::ScUndoAutoFill( ScDocShell* pNewDocShell,
569 				const ScRange& rRange, const ScRange& rSourceArea,
570 				ScDocument* pNewUndoDoc, const ScMarkData& rMark,
571 				FillDir eNewFillDir, FillCmd eNewFillCmd, FillDateCmd eNewFillDateCmd,
572 				double fNewStartValue, double fNewStepValue, double fNewMaxValue,
573 				sal_uInt16 nMaxShIndex )
574 		//
575 	:	ScBlockUndo( pNewDocShell, rRange, SC_UNDO_AUTOHEIGHT ),
576 		//
577 		aSource			( rSourceArea ),
578 		aMarkData		( rMark ),
579 		pUndoDoc		( pNewUndoDoc ),
580 		eFillDir		( eNewFillDir ),
581 		eFillCmd		( eNewFillCmd ),
582 		eFillDateCmd	( eNewFillDateCmd ),
583 		fStartValue		( fNewStartValue ),
584 		fStepValue		( fNewStepValue ),
585 		fMaxValue		( fNewMaxValue ),
586 		nMaxSharedIndex	( nMaxShIndex)
587 {
588 	SetChangeTrack();
589 }
590 
591 
592 //----------------------------------------------------------------------------
593 
~ScUndoAutoFill()594 __EXPORT ScUndoAutoFill::~ScUndoAutoFill()
595 {
596 	pDocShell->GetDocument()->EraseNonUsedSharedNames(nMaxSharedIndex);
597 	delete pUndoDoc;
598 }
599 
600 
601 //----------------------------------------------------------------------------
602 
GetComment() const603 String __EXPORT ScUndoAutoFill::GetComment() const
604 {
605 	return ScGlobal::GetRscString( STR_UNDO_AUTOFILL ); //"Ausfuellen"
606 }
607 
608 
SetChangeTrack()609 void ScUndoAutoFill::SetChangeTrack()
610 {
611 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
612 	if ( pChangeTrack )
613 		pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
614 			nStartChangeAction, nEndChangeAction );
615 	else
616 		nStartChangeAction = nEndChangeAction = 0;
617 }
618 
619 
620 //----------------------------------------------------------------------------
621 
Undo()622 void __EXPORT ScUndoAutoFill::Undo()
623 {
624 	BeginUndo();
625 
626 	ScDocument* pDoc = pDocShell->GetDocument();
627 
628 	SCTAB nTabCount = pDoc->GetTableCount();
629 	for (SCTAB nTab=0; nTab<nTabCount; nTab++)
630 	{
631 		if (aMarkData.GetTableSelect(nTab))
632 		{
633 			ScRange aWorkRange = aBlockRange;
634 			aWorkRange.aStart.SetTab(nTab);
635 			aWorkRange.aEnd.SetTab(nTab);
636 
637 			sal_uInt16 nExtFlags = 0;
638 			pDocShell->UpdatePaintExt( nExtFlags, aWorkRange );
639             pDoc->DeleteAreaTab( aWorkRange, IDF_AUTOFILL );
640             pUndoDoc->CopyToDocument( aWorkRange, IDF_AUTOFILL, sal_False, pDoc );
641 
642 			pDoc->ExtendMerge( aWorkRange, sal_True );
643 			pDocShell->PostPaint( aWorkRange, PAINT_GRID, nExtFlags );
644 		}
645 	}
646 	pDocShell->PostDataChanged();
647 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
648 	if (pViewShell)
649 		pViewShell->CellContentChanged();
650 
651 // Shared-Names loeschen
652 // Falls Undo ins Dokument gespeichert
653 // => automatisches Loeschen am Ende
654 // umarbeiten!!
655 
656 	String aName = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("___SC_"));
657 	aName += String::CreateFromInt32(nMaxSharedIndex);
658 	aName += '_';
659 	ScRangeName* pRangeName = pDoc->GetRangeName();
660 	sal_Bool bHasFound = sal_False;
661 	for (sal_uInt16 i = 0; i < pRangeName->GetCount(); i++)
662 	{
663 		ScRangeData* pRangeData = (*pRangeName)[i];
664 		if (pRangeData)
665 		{
666 			String aRName;
667 			pRangeData->GetName(aRName);
668 			if (aRName.Search(aName) != STRING_NOTFOUND)
669 			{
670 				pRangeName->AtFree(i);
671 				bHasFound = sal_True;
672 			}
673 		}
674 	}
675 	if (bHasFound)
676 		pRangeName->SetSharedMaxIndex(pRangeName->GetSharedMaxIndex()-1);
677 
678 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
679 	if ( pChangeTrack )
680 		pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
681 
682 	EndUndo();
683 }
684 
685 
686 //----------------------------------------------------------------------------
687 
Redo()688 void __EXPORT ScUndoAutoFill::Redo()
689 {
690 	BeginRedo();
691 
692 //!	Tabellen selektieren
693 
694     SCCOLROW nCount = 0;
695 	switch (eFillDir)
696 	{
697 		case FILL_TO_BOTTOM:
698 			nCount = aBlockRange.aEnd.Row() - aSource.aEnd.Row();
699 			break;
700 		case FILL_TO_RIGHT:
701 			nCount = aBlockRange.aEnd.Col() - aSource.aEnd.Col();
702 			break;
703 		case FILL_TO_TOP:
704 			nCount = aSource.aStart.Row() - aBlockRange.aStart.Row();
705 			break;
706 		case FILL_TO_LEFT:
707 			nCount = aSource.aStart.Col() - aBlockRange.aStart.Col();
708 			break;
709 	}
710 
711 	ScDocument* pDoc = pDocShell->GetDocument();
712 	if ( fStartValue != MAXDOUBLE )
713 	{
714 		SCCOL nValX = (eFillDir == FILL_TO_LEFT) ? aSource.aEnd.Col() : aSource.aStart.Col();
715 		SCROW nValY = (eFillDir == FILL_TO_TOP ) ? aSource.aEnd.Row() : aSource.aStart.Row();
716 		SCTAB nTab = aSource.aStart.Tab();
717 		pDoc->SetValue( nValX, nValY, nTab, fStartValue );
718 	}
719 	pDoc->Fill( aSource.aStart.Col(), aSource.aStart.Row(),
720 				aSource.aEnd.Col(),   aSource.aEnd.Row(),
721 				aMarkData, nCount,
722 				eFillDir, eFillCmd, eFillDateCmd,
723 				fStepValue, fMaxValue );
724 
725 	SetChangeTrack();
726 
727 	pDocShell->PostPaint( aBlockRange, PAINT_GRID );
728 	pDocShell->PostDataChanged();
729 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
730 	if (pViewShell)
731 		pViewShell->CellContentChanged();
732 
733 	EndRedo();
734 }
735 
736 
737 //----------------------------------------------------------------------------
738 
Repeat(SfxRepeatTarget & rTarget)739 void __EXPORT ScUndoAutoFill::Repeat(SfxRepeatTarget& rTarget)
740 {
741 	if (rTarget.ISA(ScTabViewTarget))
742 	{
743 		ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
744 		if (eFillCmd==FILL_SIMPLE)
745 			rViewShell.FillSimple( eFillDir, sal_True );
746 		else
747 			rViewShell.FillSeries( eFillDir, eFillCmd, eFillDateCmd,
748 								   fStartValue, fStepValue, fMaxValue, sal_True );
749 	}
750 }
751 
752 
753 //----------------------------------------------------------------------------
754 
CanRepeat(SfxRepeatTarget & rTarget) const755 sal_Bool __EXPORT ScUndoAutoFill::CanRepeat(SfxRepeatTarget& rTarget) const
756 {
757 	return (rTarget.ISA(ScTabViewTarget));
758 }
759 
760 
761 //============================================================================
762 //	class ScUndoMerge
763 //
764 //	Zellen zusammenfassen / Zusammenfassung aufheben
765 
766 //----------------------------------------------------------------------------
767 
ScUndoMerge(ScDocShell * pNewDocShell,SCCOL nStartX,SCROW nStartY,SCTAB nStartZ,SCCOL nEndX,SCROW nEndY,SCTAB nEndZ,bool bMergeContents,ScDocument * pUndoDoc,SdrUndoAction * pDrawUndo)768 ScUndoMerge::ScUndoMerge( ScDocShell* pNewDocShell,
769 							SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
770 							SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
771                             bool bMergeContents, ScDocument* pUndoDoc, SdrUndoAction* pDrawUndo )
772 		//
773 	:	ScSimpleUndo( pNewDocShell ),
774 		//
775 		maRange( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ),
776         mbMergeContents( bMergeContents ),
777         mpUndoDoc( pUndoDoc ),
778         mpDrawUndo( pDrawUndo )
779 {
780 }
781 
782 
783 //----------------------------------------------------------------------------
784 
~ScUndoMerge()785 ScUndoMerge::~ScUndoMerge()
786 {
787 	delete mpUndoDoc;
788     DeleteSdrUndoAction( mpDrawUndo );
789 }
790 
791 
792 //----------------------------------------------------------------------------
793 
GetComment() const794 String ScUndoMerge::GetComment() const
795 {
796 	return ScGlobal::GetRscString( STR_UNDO_MERGE );
797 }
798 
799 
800 //----------------------------------------------------------------------------
801 
DoChange(bool bUndo) const802 void ScUndoMerge::DoChange( bool bUndo ) const
803 {
804 	ScDocument* pDoc = pDocShell->GetDocument();
805 
806 	ScUndoUtil::MarkSimpleBlock( pDocShell, maRange );
807 
808 	if (bUndo)
809         // remove merge (contents are copied back below from undo document)
810 		pDoc->RemoveMerge( maRange.aStart.Col(), maRange.aStart.Row(), maRange.aStart.Tab() );
811 	else
812         // repeat merge, but do not remove note captions (will be done by drawing redo below)
813 /*!*/	pDoc->DoMerge( maRange.aStart.Tab(),
814 					   maRange.aStart.Col(), maRange.aStart.Row(),
815                        maRange.aEnd.Col(),   maRange.aEnd.Row(), false );
816 
817     // undo -> copy back deleted contents
818 	if (bUndo && mpUndoDoc)
819     {
820         pDoc->DeleteAreaTab( maRange, IDF_CONTENTS|IDF_NOCAPTIONS );
821         mpUndoDoc->CopyToDocument( maRange, IDF_ALL|IDF_NOCAPTIONS, sal_False, pDoc );
822     }
823 
824     // redo -> merge contents again
825     else if (!bUndo && mbMergeContents)
826     {
827 /*!*/   pDoc->DoMergeContents( maRange.aStart.Tab(),
828 							   maRange.aStart.Col(), maRange.aStart.Row(),
829 							   maRange.aEnd.Col(),   maRange.aEnd.Row()   );
830     }
831 
832     if (bUndo)
833         DoSdrUndoAction( mpDrawUndo, pDoc );
834     else
835         RedoSdrUndoAction( mpDrawUndo );
836 
837 	sal_Bool bDidPaint = sal_False;
838 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
839 	if ( pViewShell )
840 	{
841 		pViewShell->SetTabNo( maRange.aStart.Tab() );
842 		bDidPaint = pViewShell->AdjustRowHeight( maRange.aStart.Row(), maRange.aEnd.Row() );
843 	}
844 
845 	if (!bDidPaint)
846 		ScUndoUtil::PaintMore( pDocShell, maRange );
847 
848 	ShowTable( maRange );
849 }
850 
851 
852 //----------------------------------------------------------------------------
853 
Undo()854 void ScUndoMerge::Undo()
855 {
856 	BeginUndo();
857 	DoChange( true );
858 	EndUndo();
859 }
860 
861 
862 //----------------------------------------------------------------------------
863 
Redo()864 void ScUndoMerge::Redo()
865 {
866 	BeginRedo();
867 	DoChange( false );
868 	EndRedo();
869 }
870 
871 
872 //----------------------------------------------------------------------------
873 
Repeat(SfxRepeatTarget & rTarget)874 void ScUndoMerge::Repeat(SfxRepeatTarget& rTarget)
875 {
876 	if (rTarget.ISA(ScTabViewTarget))
877 	{
878 		ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
879 		sal_Bool bCont = sal_False;
880 		rViewShell.MergeCells( sal_False, bCont, sal_True );
881 	}
882 }
883 
884 
885 //----------------------------------------------------------------------------
886 
CanRepeat(SfxRepeatTarget & rTarget) const887 sal_Bool ScUndoMerge::CanRepeat(SfxRepeatTarget& rTarget) const
888 {
889 	return (rTarget.ISA(ScTabViewTarget));
890 }
891 
892 
893 //============================================================================
894 //	class ScUndoAutoFormat
895 //
896 //		Auto-Format (nur einfache Bloecke)
897 
898 //----------------------------------------------------------------------------
899 
ScUndoAutoFormat(ScDocShell * pNewDocShell,const ScRange & rRange,ScDocument * pNewUndoDoc,const ScMarkData & rMark,sal_Bool bNewSize,sal_uInt16 nNewFormatNo)900 ScUndoAutoFormat::ScUndoAutoFormat( ScDocShell* pNewDocShell,
901 						const ScRange& rRange, ScDocument* pNewUndoDoc,
902 						const ScMarkData& rMark, sal_Bool bNewSize, sal_uInt16 nNewFormatNo )
903 		//
904 	:	ScBlockUndo( pNewDocShell, rRange, bNewSize ? SC_UNDO_MANUALHEIGHT : SC_UNDO_AUTOHEIGHT ),
905 		//
906 		pUndoDoc	( pNewUndoDoc ),
907 		aMarkData	( rMark ),
908 		bSize		( bNewSize ),
909 		nFormatNo	( nNewFormatNo )
910 {
911 }
912 
913 
914 //----------------------------------------------------------------------------
915 
~ScUndoAutoFormat()916 __EXPORT ScUndoAutoFormat::~ScUndoAutoFormat()
917 {
918 	delete pUndoDoc;
919 }
920 
921 
922 //----------------------------------------------------------------------------
923 
GetComment() const924 String __EXPORT ScUndoAutoFormat::GetComment() const
925 {
926 	return ScGlobal::GetRscString( STR_UNDO_AUTOFORMAT );	//"Auto-Format"
927 }
928 
929 
930 //----------------------------------------------------------------------------
931 
Undo()932 void __EXPORT ScUndoAutoFormat::Undo()
933 {
934 	BeginUndo();
935 
936 	ScDocument* pDoc = pDocShell->GetDocument();
937 
938 	// Attribute
939 //	pDoc->DeleteAreaTab( aBlockRange, IDF_ATTRIB );
940 //	pUndoDoc->CopyToDocument( aBlockRange, IDF_ATTRIB, sal_False, pDoc );
941 
942 	SCTAB nTabCount = pDoc->GetTableCount();
943 	pDoc->DeleteArea( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(),
944 					  aBlockRange.aEnd.Col(), aBlockRange.aEnd.Row(),
945 					  aMarkData, IDF_ATTRIB );
946 	ScRange aCopyRange = aBlockRange;
947 	aCopyRange.aStart.SetTab(0);
948 	aCopyRange.aEnd.SetTab(nTabCount-1);
949 	pUndoDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_False, pDoc, &aMarkData );
950 
951 	// Zellhoehen und -breiten (IDF_NONE)
952 	if (bSize)
953 	{
954 		SCCOL nStartX = aBlockRange.aStart.Col();
955 		SCROW nStartY = aBlockRange.aStart.Row();
956 		SCTAB nStartZ = aBlockRange.aStart.Tab();
957 		SCCOL nEndX = aBlockRange.aEnd.Col();
958 		SCROW nEndY = aBlockRange.aEnd.Row();
959 		SCTAB nEndZ = aBlockRange.aEnd.Tab();
960 
961 		pUndoDoc->CopyToDocument( nStartX, 0, 0, nEndX, MAXROW, nTabCount-1,
962 									IDF_NONE, sal_False, pDoc, &aMarkData );
963 		pUndoDoc->CopyToDocument( 0, nStartY, 0, MAXCOL, nEndY, nTabCount-1,
964 									IDF_NONE, sal_False, pDoc, &aMarkData );
965 		pDocShell->PostPaint( 0, 0, nStartZ, MAXCOL, MAXROW, nEndZ,
966 							  PAINT_GRID | PAINT_LEFT | PAINT_TOP, SC_PF_LINES );
967 	}
968 	else
969 		pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES );
970 
971 	EndUndo();
972 }
973 
974 
975 //----------------------------------------------------------------------------
976 
Redo()977 void __EXPORT ScUndoAutoFormat::Redo()
978 {
979 	BeginRedo();
980 
981 	ScDocument* pDoc = pDocShell->GetDocument();
982 
983 	SCCOL nStartX = aBlockRange.aStart.Col();
984 	SCROW nStartY = aBlockRange.aStart.Row();
985 	SCTAB nStartZ = aBlockRange.aStart.Tab();
986 	SCCOL nEndX = aBlockRange.aEnd.Col();
987 	SCROW nEndY = aBlockRange.aEnd.Row();
988 	SCTAB nEndZ = aBlockRange.aEnd.Tab();
989 
990 	pDoc->AutoFormat( nStartX, nStartY, nEndX, nEndY, nFormatNo, aMarkData );
991 
992 	if (bSize)
993 	{
994 		VirtualDevice aVirtDev;
995 		Fraction aZoomX(1,1);
996 		Fraction aZoomY = aZoomX;
997 		double nPPTX,nPPTY;
998 		ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
999 		if (pViewShell)
1000 		{
1001 			ScViewData* pData = pViewShell->GetViewData();
1002 			nPPTX = pData->GetPPTX();
1003 			nPPTY = pData->GetPPTY();
1004 			aZoomX = pData->GetZoomX();
1005 			aZoomY = pData->GetZoomY();
1006 		}
1007 		else
1008 		{
1009 			//	Zoom auf 100 lassen
1010 			nPPTX = ScGlobal::nScreenPPTX;
1011 			nPPTY = ScGlobal::nScreenPPTY;
1012 		}
1013 
1014 		sal_Bool bFormula = sal_False;	//! merken
1015 
1016 		for (SCTAB nTab=nStartZ; nTab<=nEndZ; nTab++)
1017 		{
1018 			ScMarkData aDestMark;
1019 			aDestMark.SelectOneTable( nTab );
1020 			aDestMark.SetMarkArea( ScRange( nStartX, nStartY, nTab, nEndX, nEndY, nTab ) );
1021 			aDestMark.MarkToMulti();
1022 
1023 			// wie SC_SIZE_VISOPT
1024             SCROW nLastRow = -1;
1025 			for (SCROW nRow=nStartY; nRow<=nEndY; nRow++)
1026 			{
1027 				sal_uInt8 nOld = pDoc->GetRowFlags(nRow,nTab);
1028                 bool bHidden = pDoc->RowHidden(nRow, nTab, nLastRow);
1029 				if ( !bHidden && ( nOld & CR_MANUALSIZE ) )
1030 					pDoc->SetRowFlags( nRow, nTab, nOld & ~CR_MANUALSIZE );
1031 			}
1032 			pDoc->SetOptimalHeight( nStartY, nEndY, nTab, 0, &aVirtDev,
1033 										nPPTX, nPPTY, aZoomX, aZoomY, sal_False );
1034 
1035             SCCOL nLastCol = -1;
1036 			for (SCCOL nCol=nStartX; nCol<=nEndX; nCol++)
1037                 if (!pDoc->ColHidden(nCol, nTab, nLastCol))
1038 				{
1039 					sal_uInt16 nThisSize = STD_EXTRA_WIDTH + pDoc->GetOptimalColWidth( nCol, nTab,
1040 												&aVirtDev, nPPTX, nPPTY, aZoomX, aZoomY, bFormula,
1041 												&aDestMark );
1042 					pDoc->SetColWidth( nCol, nTab, nThisSize );
1043 					pDoc->ShowCol( nCol, nTab, sal_True );
1044 				}
1045 		}
1046 
1047 		pDocShell->PostPaint( 0,      0,      nStartZ,
1048 							  MAXCOL, MAXROW, nEndZ,
1049 							  PAINT_GRID | PAINT_LEFT | PAINT_TOP, SC_PF_LINES);
1050 	}
1051 	else
1052 		pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES );
1053 
1054 	EndRedo();
1055 }
1056 
1057 
1058 //----------------------------------------------------------------------------
1059 
Repeat(SfxRepeatTarget & rTarget)1060 void __EXPORT ScUndoAutoFormat::Repeat(SfxRepeatTarget& rTarget)
1061 {
1062 	if (rTarget.ISA(ScTabViewTarget))
1063 		((ScTabViewTarget&)rTarget).GetViewShell()->AutoFormat( nFormatNo, sal_True );
1064 }
1065 
1066 
1067 //----------------------------------------------------------------------------
1068 
CanRepeat(SfxRepeatTarget & rTarget) const1069 sal_Bool __EXPORT ScUndoAutoFormat::CanRepeat(SfxRepeatTarget& rTarget) const
1070 {
1071 	return (rTarget.ISA(ScTabViewTarget));
1072 }
1073 
1074 
1075 //============================================================================
1076 //	class ScUndoReplace
1077 //
1078 //		Ersetzen
1079 
1080 //----------------------------------------------------------------------------
1081 
ScUndoReplace(ScDocShell * pNewDocShell,const ScMarkData & rMark,SCCOL nCurX,SCROW nCurY,SCTAB nCurZ,const String & rNewUndoStr,ScDocument * pNewUndoDoc,const SvxSearchItem * pItem)1082 ScUndoReplace::ScUndoReplace( ScDocShell* pNewDocShell, const ScMarkData& rMark,
1083 									SCCOL nCurX, SCROW nCurY, SCTAB nCurZ,
1084 									const String& rNewUndoStr, ScDocument* pNewUndoDoc,
1085 									const SvxSearchItem* pItem )
1086 		//
1087 	:	ScSimpleUndo( pNewDocShell ),
1088 		//
1089 		aCursorPos	( nCurX, nCurY, nCurZ ),
1090 		aMarkData	( rMark ),
1091 		aUndoStr	( rNewUndoStr ),
1092 		pUndoDoc	( pNewUndoDoc )
1093 {
1094 	pSearchItem = new SvxSearchItem( *pItem );
1095 	SetChangeTrack();
1096 }
1097 
1098 
1099 //----------------------------------------------------------------------------
1100 
~ScUndoReplace()1101 __EXPORT ScUndoReplace::~ScUndoReplace()
1102 {
1103 	delete pUndoDoc;
1104 	delete pSearchItem;
1105 }
1106 
1107 
1108 //----------------------------------------------------------------------------
1109 
SetChangeTrack()1110 void ScUndoReplace::SetChangeTrack()
1111 {
1112 	ScDocument* pDoc = pDocShell->GetDocument();
1113 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1114 	if ( pChangeTrack )
1115 	{
1116 		if ( pUndoDoc )
1117 		{	//! im UndoDoc stehen nur die geaenderten Zellen,
1118 			// deswegen per Iterator moeglich
1119 			pChangeTrack->AppendContentsIfInRefDoc( pUndoDoc,
1120 				nStartChangeAction,	nEndChangeAction );
1121 		}
1122 		else
1123 		{
1124 			nStartChangeAction = pChangeTrack->GetActionMax() + 1;
1125 			ScChangeActionContent* pContent = new ScChangeActionContent(
1126 				ScRange( aCursorPos) );
1127 			pContent->SetOldValue( aUndoStr, pDoc );
1128 			pContent->SetNewValue( pDoc->GetCell( aCursorPos ), pDoc );
1129 			pChangeTrack->Append( pContent );
1130 			nEndChangeAction = pChangeTrack->GetActionMax();
1131 		}
1132 	}
1133 	else
1134 		nStartChangeAction = nEndChangeAction = 0;
1135 }
1136 
1137 //----------------------------------------------------------------------------
1138 
GetComment() const1139 String __EXPORT ScUndoReplace::GetComment() const
1140 {
1141 	return ScGlobal::GetRscString( STR_UNDO_REPLACE );	// "Ersetzen"
1142 }
1143 
1144 
1145 //----------------------------------------------------------------------------
1146 
Undo()1147 void __EXPORT ScUndoReplace::Undo()
1148 {
1149 	BeginUndo();
1150 
1151 	ScDocument* pDoc = pDocShell->GetDocument();
1152 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1153 
1154 	ShowTable( aCursorPos.Tab() );
1155 
1156 	if (pUndoDoc)		// nur bei ReplaceAll !!
1157 	{
1158 		DBG_ASSERT(pSearchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL,
1159 				   "ScUndoReplace:: Falscher Modus");
1160 
1161 	    SetViewMarkData( aMarkData );
1162 
1163 //!	markierte Tabellen
1164 //!	Bereich merken ?
1165 
1166 		//	Undo-Dokument hat keine Zeilen-/Spalten-Infos, also mit bColRowFlags = FALSE
1167 		//	kopieren, um Outline-Gruppen nicht kaputtzumachen.
1168 
1169 		sal_uInt16 nUndoFlags = (pSearchItem->GetPattern()) ? IDF_ATTRIB : IDF_CONTENTS;
1170 		pUndoDoc->CopyToDocument( 0,      0,      0,
1171 								  MAXCOL, MAXROW, MAXTAB,
1172 								  nUndoFlags, sal_False, pDoc, NULL, sal_False );	// ohne Row-Flags
1173 		pDocShell->PostPaintGridAll();
1174 	}
1175 	else if (pSearchItem->GetPattern() &&
1176 			 pSearchItem->GetCommand() == SVX_SEARCHCMD_REPLACE)
1177 	{
1178 		String aTempStr = pSearchItem->GetSearchString();		// vertauschen
1179 		pSearchItem->SetSearchString(pSearchItem->GetReplaceString());
1180 		pSearchItem->SetReplaceString(aTempStr);
1181 		pDoc->ReplaceStyle( *pSearchItem,
1182 							aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(),
1183 							aMarkData, sal_True);
1184 		pSearchItem->SetReplaceString(pSearchItem->GetSearchString());
1185 		pSearchItem->SetSearchString(aTempStr);
1186 		if (pViewShell)
1187 			pViewShell->MoveCursorAbs( aCursorPos.Col(), aCursorPos.Row(),
1188 									   SC_FOLLOW_JUMP, sal_False, sal_False );
1189 		pDocShell->PostPaintGridAll();
1190 	}
1191 	else if (pSearchItem->GetCellType() == SVX_SEARCHIN_NOTE)
1192 	{
1193         ScPostIt* pNote = pDoc->GetNote( aCursorPos );
1194         DBG_ASSERT( pNote, "ScUndoReplace::Undo - cell does not contain a note" );
1195         if (pNote)
1196             pNote->SetText( aCursorPos, aUndoStr );
1197 		if (pViewShell)
1198 			pViewShell->MoveCursorAbs( aCursorPos.Col(), aCursorPos.Row(),
1199 									   SC_FOLLOW_JUMP, sal_False, sal_False );
1200 	}
1201 	else
1202 	{
1203 		// #78889# aUndoStr may contain line breaks
1204 		if ( aUndoStr.Search('\n') != STRING_NOTFOUND )
1205 			pDoc->PutCell( aCursorPos, new ScEditCell( aUndoStr, pDoc ) );
1206 		else
1207 			pDoc->SetString( aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), aUndoStr );
1208 		if (pViewShell)
1209 			pViewShell->MoveCursorAbs( aCursorPos.Col(), aCursorPos.Row(),
1210 									   SC_FOLLOW_JUMP, sal_False, sal_False );
1211 		pDocShell->PostPaintGridAll();
1212 	}
1213 
1214 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1215 	if ( pChangeTrack )
1216 		pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1217 
1218 	EndUndo();
1219 }
1220 
1221 
1222 //----------------------------------------------------------------------------
1223 
Redo()1224 void __EXPORT ScUndoReplace::Redo()
1225 {
1226 	BeginRedo();
1227 
1228 	ScDocument* pDoc = pDocShell->GetDocument();
1229 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1230 
1231 	if (pViewShell)
1232 		pViewShell->MoveCursorAbs( aCursorPos.Col(), aCursorPos.Row(),
1233 								   SC_FOLLOW_JUMP, sal_False, sal_False );
1234 	if (pUndoDoc)
1235 	{
1236 		if (pViewShell)
1237 		{
1238             SetViewMarkData( aMarkData );
1239 
1240 			pViewShell->SearchAndReplace( pSearchItem, sal_False, sal_True );
1241 		}
1242 	}
1243 	else if (pSearchItem->GetPattern() &&
1244 			 pSearchItem->GetCommand() == SVX_SEARCHCMD_REPLACE)
1245 	{
1246 		pDoc->ReplaceStyle( *pSearchItem,
1247 							aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(),
1248 							aMarkData, sal_True);
1249 		pDocShell->PostPaintGridAll();
1250 	}
1251 	else
1252 		if (pViewShell)
1253 			pViewShell->SearchAndReplace( pSearchItem, sal_False, sal_True );
1254 
1255 	SetChangeTrack();
1256 
1257 	EndRedo();
1258 }
1259 
1260 
1261 //----------------------------------------------------------------------------
1262 
Repeat(SfxRepeatTarget & rTarget)1263 void __EXPORT ScUndoReplace::Repeat(SfxRepeatTarget& rTarget)
1264 {
1265 	if (rTarget.ISA(ScTabViewTarget))
1266 		((ScTabViewTarget&)rTarget).GetViewShell()->SearchAndReplace( pSearchItem, sal_True, sal_False );
1267 }
1268 
1269 
1270 //----------------------------------------------------------------------------
1271 
CanRepeat(SfxRepeatTarget & rTarget) const1272 sal_Bool __EXPORT ScUndoReplace::CanRepeat(SfxRepeatTarget& rTarget) const
1273 {
1274 	return (rTarget.ISA(ScTabViewTarget));
1275 }
1276 
1277 
1278 //============================================================================
1279 //	class ScUndoTabOp
1280 //
1281 //	Mehrfachoperation (nur einfache Bloecke)
1282 
1283 //----------------------------------------------------------------------------
1284 
ScUndoTabOp(ScDocShell * pNewDocShell,SCCOL nStartX,SCROW nStartY,SCTAB nStartZ,SCCOL nEndX,SCROW nEndY,SCTAB nEndZ,ScDocument * pNewUndoDoc,const ScRefAddress & rFormulaCell,const ScRefAddress & rFormulaEnd,const ScRefAddress & rRowCell,const ScRefAddress & rColCell,sal_uInt8 nMd)1285 ScUndoTabOp::ScUndoTabOp( ScDocShell* pNewDocShell,
1286 				SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
1287 				SCCOL nEndX, SCROW nEndY, SCTAB nEndZ, ScDocument* pNewUndoDoc,
1288 				const ScRefAddress& rFormulaCell,
1289 				const ScRefAddress& rFormulaEnd,
1290 				const ScRefAddress& rRowCell,
1291 				const ScRefAddress& rColCell,
1292 				sal_uInt8 nMd )
1293 		//
1294 	:	ScSimpleUndo( pNewDocShell ),
1295 		//
1296 		aRange			( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ),
1297 		pUndoDoc		( pNewUndoDoc ),
1298 		theFormulaCell	( rFormulaCell ),
1299 		theFormulaEnd	( rFormulaEnd ),
1300 		theRowCell		( rRowCell ),
1301 		theColCell		( rColCell ),
1302 		nMode			( nMd )
1303 {
1304 }
1305 
1306 
1307 //----------------------------------------------------------------------------
1308 
~ScUndoTabOp()1309 __EXPORT ScUndoTabOp::~ScUndoTabOp()
1310 {
1311 	delete pUndoDoc;
1312 }
1313 
1314 
1315 //----------------------------------------------------------------------------
1316 
GetComment() const1317 String __EXPORT ScUndoTabOp::GetComment() const
1318 {
1319 	return ScGlobal::GetRscString( STR_UNDO_TABOP );	// "Mehrfachoperation"
1320 }
1321 
1322 
1323 //----------------------------------------------------------------------------
1324 
Undo()1325 void __EXPORT ScUndoTabOp::Undo()
1326 {
1327 	BeginUndo();
1328 
1329 	ScUndoUtil::MarkSimpleBlock( pDocShell, aRange );
1330 
1331 	sal_uInt16 nExtFlags = 0;
1332 	pDocShell->UpdatePaintExt( nExtFlags, aRange );
1333 
1334 	ScDocument* pDoc = pDocShell->GetDocument();
1335     pDoc->DeleteAreaTab( aRange,IDF_ALL & ~IDF_NOTE );
1336     pUndoDoc->CopyToDocument( aRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc );
1337 	pDocShell->PostPaint( aRange, PAINT_GRID, nExtFlags );
1338 	pDocShell->PostDataChanged();
1339 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1340 	if (pViewShell)
1341 		pViewShell->CellContentChanged();
1342 
1343 	EndUndo();
1344 }
1345 
1346 
1347 //----------------------------------------------------------------------------
1348 
Redo()1349 void __EXPORT ScUndoTabOp::Redo()
1350 {
1351 	BeginRedo();
1352 
1353 	ScUndoUtil::MarkSimpleBlock( pDocShell, aRange );
1354 
1355 	ScTabOpParam aParam( theFormulaCell, theFormulaEnd,
1356 						 theRowCell,     theColCell,
1357 						 nMode );
1358 
1359 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1360 	if (pViewShell)
1361 		pViewShell->TabOp( aParam, sal_False);
1362 
1363 	EndRedo();
1364 }
1365 
1366 
1367 //----------------------------------------------------------------------------
1368 
Repeat(SfxRepeatTarget &)1369 void __EXPORT ScUndoTabOp::Repeat(SfxRepeatTarget& /* rTarget */)
1370 {
1371 }
1372 
1373 
1374 //----------------------------------------------------------------------------
1375 
CanRepeat(SfxRepeatTarget &) const1376 sal_Bool __EXPORT ScUndoTabOp::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1377 {
1378 	return sal_False;
1379 }
1380 
1381 
1382 //============================================================================
1383 //  class ScUndoConversion
1384 //
1385 //	Spelling
1386 
1387 //----------------------------------------------------------------------------
1388 
ScUndoConversion(ScDocShell * pNewDocShell,const ScMarkData & rMark,SCCOL nCurX,SCROW nCurY,SCTAB nCurZ,ScDocument * pNewUndoDoc,SCCOL nNewX,SCROW nNewY,SCTAB nNewZ,ScDocument * pNewRedoDoc,const ScConversionParam & rConvParam)1389 ScUndoConversion::ScUndoConversion(
1390         ScDocShell* pNewDocShell, const ScMarkData& rMark,
1391         SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, ScDocument* pNewUndoDoc,
1392         SCCOL nNewX, SCROW nNewY, SCTAB nNewZ, ScDocument* pNewRedoDoc,
1393         const ScConversionParam& rConvParam ) :
1394     ScSimpleUndo( pNewDocShell ),
1395     aMarkData( rMark ),
1396     aCursorPos( nCurX, nCurY, nCurZ ),
1397     pUndoDoc( pNewUndoDoc ),
1398     aNewCursorPos( nNewX, nNewY, nNewZ ),
1399     pRedoDoc( pNewRedoDoc ),
1400     maConvParam( rConvParam )
1401 {
1402 	SetChangeTrack();
1403 }
1404 
1405 
1406 //----------------------------------------------------------------------------
1407 
~ScUndoConversion()1408 __EXPORT ScUndoConversion::~ScUndoConversion()
1409 {
1410 	delete pUndoDoc;
1411 	delete pRedoDoc;
1412 }
1413 
1414 
1415 //----------------------------------------------------------------------------
1416 
SetChangeTrack()1417 void ScUndoConversion::SetChangeTrack()
1418 {
1419 	ScDocument* pDoc = pDocShell->GetDocument();
1420 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1421 	if ( pChangeTrack )
1422 	{
1423 		if ( pUndoDoc )
1424 			pChangeTrack->AppendContentsIfInRefDoc( pUndoDoc,
1425 				nStartChangeAction, nEndChangeAction );
1426 		else
1427 		{
1428             DBG_ERROR( "ScUndoConversion::SetChangeTrack: kein UndoDoc" );
1429 			nStartChangeAction = nEndChangeAction = 0;
1430 		}
1431 	}
1432 	else
1433 		nStartChangeAction = nEndChangeAction = 0;
1434 }
1435 
1436 //----------------------------------------------------------------------------
1437 
GetComment() const1438 String ScUndoConversion::GetComment() const
1439 {
1440     String aText;
1441     switch( maConvParam.GetType() )
1442     {
1443         case SC_CONVERSION_SPELLCHECK:      aText = ScGlobal::GetRscString( STR_UNDO_SPELLING );    break;
1444         case SC_CONVERSION_HANGULHANJA:     aText = ScGlobal::GetRscString( STR_UNDO_HANGULHANJA ); break;
1445         case SC_CONVERSION_CHINESE_TRANSL:  aText = ScGlobal::GetRscString( STR_UNDO_CHINESE_TRANSLATION ); break;
1446         default: DBG_ERRORFILE( "ScUndoConversion::GetComment - unknown conversion type" );
1447     }
1448     return aText;
1449 }
1450 
1451 
1452 //----------------------------------------------------------------------------
1453 
DoChange(ScDocument * pRefDoc,const ScAddress & rCursorPos)1454 void ScUndoConversion::DoChange( ScDocument* pRefDoc, const ScAddress& rCursorPos )
1455 {
1456 	if (pRefDoc)
1457 	{
1458 		ScDocument* pDoc = pDocShell->GetDocument();
1459 		ShowTable( rCursorPos.Tab() );
1460 
1461 	    SetViewMarkData( aMarkData );
1462 
1463 		SCTAB nTabCount = pDoc->GetTableCount();
1464 		//	Undo/Redo-doc has only selected tables
1465 
1466 		sal_Bool bMulti = aMarkData.IsMultiMarked();
1467 		pRefDoc->CopyToDocument( 0,      0,      0,
1468 								 MAXCOL, MAXROW, nTabCount-1,
1469 								 IDF_CONTENTS, bMulti, pDoc, &aMarkData );
1470 		pDocShell->PostPaintGridAll();
1471 	}
1472 	else
1473 	{
1474 		DBG_ERROR("Kein Un-/RedoDoc bei Un-/RedoSpelling");
1475 	}
1476 }
1477 
1478 
1479 //----------------------------------------------------------------------------
1480 
Undo()1481 void ScUndoConversion::Undo()
1482 {
1483 	BeginUndo();
1484 	DoChange( pUndoDoc, aCursorPos );
1485 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
1486 	if ( pChangeTrack )
1487 		pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1488 	EndUndo();
1489 }
1490 
1491 
1492 //----------------------------------------------------------------------------
1493 
Redo()1494 void ScUndoConversion::Redo()
1495 {
1496 	BeginRedo();
1497 	DoChange( pRedoDoc, aNewCursorPos );
1498 	SetChangeTrack();
1499 	EndRedo();
1500 }
1501 
1502 
1503 //----------------------------------------------------------------------------
1504 
Repeat(SfxRepeatTarget & rTarget)1505 void ScUndoConversion::Repeat( SfxRepeatTarget& rTarget )
1506 {
1507     if( rTarget.ISA( ScTabViewTarget ) )
1508         ((ScTabViewTarget&)rTarget).GetViewShell()->DoSheetConversion( maConvParam, sal_True );
1509 }
1510 
1511 
1512 //----------------------------------------------------------------------------
1513 
CanRepeat(SfxRepeatTarget & rTarget) const1514 sal_Bool ScUndoConversion::CanRepeat(SfxRepeatTarget& rTarget) const
1515 {
1516     return rTarget.ISA( ScTabViewTarget );
1517 }
1518 
1519 
1520 //============================================================================
1521 //  class ScUndoRefConversion
1522 //
1523 //	cell reference conversion
1524 
1525 //----------------------------------------------------------------------------
1526 
ScUndoRefConversion(ScDocShell * pNewDocShell,const ScRange & aMarkRange,const ScMarkData & rMark,ScDocument * pNewUndoDoc,ScDocument * pNewRedoDoc,sal_Bool bNewMulti,sal_uInt16 nNewFlag)1527 ScUndoRefConversion::ScUndoRefConversion( ScDocShell* pNewDocShell,
1528                                          const ScRange& aMarkRange, const ScMarkData& rMark,
1529                                          ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc, sal_Bool bNewMulti, sal_uInt16 nNewFlag) :
1530 ScSimpleUndo( pNewDocShell ),
1531 aMarkData   ( rMark ),
1532 pUndoDoc	( pNewUndoDoc ),
1533 pRedoDoc	( pNewRedoDoc ),
1534 aRange  	( aMarkRange ),
1535 bMulti      ( bNewMulti ),
1536 nFlags      ( nNewFlag )
1537 {
1538     SetChangeTrack();
1539 }
1540 
~ScUndoRefConversion()1541 __EXPORT ScUndoRefConversion::~ScUndoRefConversion()
1542 {
1543     delete pUndoDoc;
1544     delete pRedoDoc;
1545 }
1546 
GetComment() const1547 String __EXPORT ScUndoRefConversion::GetComment() const
1548 {
1549     return ScGlobal::GetRscString( STR_UNDO_ENTERDATA ); // "Eingabe"
1550 }
1551 
SetChangeTrack()1552 void ScUndoRefConversion::SetChangeTrack()
1553 {
1554     ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
1555     if ( pChangeTrack && (nFlags & IDF_FORMULA) )
1556         pChangeTrack->AppendContentsIfInRefDoc( pUndoDoc,
1557             nStartChangeAction, nEndChangeAction );
1558     else
1559         nStartChangeAction = nEndChangeAction = 0;
1560 }
1561 
DoChange(ScDocument * pRefDoc)1562 void ScUndoRefConversion::DoChange( ScDocument* pRefDoc)
1563 {
1564     ScDocument* pDoc = pDocShell->GetDocument();
1565 
1566     ShowTable(aRange);
1567 
1568     SetViewMarkData( aMarkData );
1569 
1570     ScRange aCopyRange = aRange;
1571     SCTAB nTabCount = pDoc->GetTableCount();
1572     aCopyRange.aStart.SetTab(0);
1573     aCopyRange.aEnd.SetTab(nTabCount-1);
1574     pRefDoc->CopyToDocument( aCopyRange, nFlags, bMulti, pDoc, &aMarkData );
1575     pDocShell->PostPaint( aRange, PAINT_GRID);
1576     pDocShell->PostDataChanged();
1577     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1578     if (pViewShell)
1579         pViewShell->CellContentChanged();
1580 }
Undo()1581 void __EXPORT ScUndoRefConversion::Undo()
1582 {
1583     BeginUndo();
1584     if (pUndoDoc)
1585         DoChange(pUndoDoc);
1586     ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
1587     if ( pChangeTrack )
1588         pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1589     EndUndo();
1590 }
1591 
Redo()1592 void __EXPORT ScUndoRefConversion::Redo()
1593 {
1594     BeginRedo();
1595     if (pRedoDoc)
1596         DoChange(pRedoDoc);
1597     SetChangeTrack();
1598     EndRedo();
1599 }
1600 
Repeat(SfxRepeatTarget & rTarget)1601 void __EXPORT ScUndoRefConversion::Repeat(SfxRepeatTarget& rTarget)
1602 {
1603     if (rTarget.ISA(ScTabViewTarget))
1604         ((ScTabViewTarget&)rTarget).GetViewShell()->DoRefConversion();
1605 }
1606 
CanRepeat(SfxRepeatTarget & rTarget) const1607 sal_Bool __EXPORT ScUndoRefConversion::CanRepeat(SfxRepeatTarget& rTarget) const
1608 {
1609     return (rTarget.ISA(ScTabViewTarget));
1610 }
1611 //============================================================================
1612 //	class ScUndoRefreshLink
1613 //
1614 //	Link aktualisieren / aendern
1615 
1616 //----------------------------------------------------------------------------
1617 
ScUndoRefreshLink(ScDocShell * pNewDocShell,ScDocument * pNewUndoDoc)1618 ScUndoRefreshLink::ScUndoRefreshLink( ScDocShell* pNewDocShell,
1619 									ScDocument* pNewUndoDoc )
1620 		//
1621 	:	ScSimpleUndo( pNewDocShell ),
1622 		//
1623 		pUndoDoc( pNewUndoDoc ),
1624 		pRedoDoc( NULL )
1625 {
1626 }
1627 
1628 
1629 //----------------------------------------------------------------------------
1630 
~ScUndoRefreshLink()1631 __EXPORT ScUndoRefreshLink::~ScUndoRefreshLink()
1632 {
1633 	delete pUndoDoc;
1634 	delete pRedoDoc;
1635 }
1636 
1637 
1638 //----------------------------------------------------------------------------
1639 
GetComment() const1640 String __EXPORT ScUndoRefreshLink::GetComment() const
1641 {
1642 	return ScGlobal::GetRscString( STR_UNDO_UPDATELINK );
1643 }
1644 
1645 
1646 //----------------------------------------------------------------------------
1647 
Undo()1648 void __EXPORT ScUndoRefreshLink::Undo()
1649 {
1650 	BeginUndo();
1651 
1652 	sal_Bool bMakeRedo = !pRedoDoc;
1653 	if (bMakeRedo)
1654 		pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
1655 
1656 	sal_Bool bFirst = sal_True;
1657 	ScDocument* pDoc = pDocShell->GetDocument();
1658 	SCTAB nCount = pDoc->GetTableCount();
1659 	for (SCTAB nTab=0; nTab<nCount; nTab++)
1660 		if (pUndoDoc->HasTable(nTab))
1661 		{
1662 			ScRange aRange(0,0,nTab,MAXCOL,MAXROW,nTab);
1663 			if (bMakeRedo)
1664 			{
1665 				if (bFirst)
1666 					pRedoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );
1667 				else
1668 					pRedoDoc->AddUndoTab( nTab, nTab, sal_True, sal_True );
1669 				bFirst = sal_False;
1670 				pDoc->CopyToDocument(aRange, IDF_ALL, sal_False, pRedoDoc);
1671 //				pRedoDoc->TransferDrawPage( pDoc, nTab, nTab );
1672 				pRedoDoc->SetLink( nTab,
1673 								   pDoc->GetLinkMode(nTab),
1674 								   pDoc->GetLinkDoc(nTab),
1675 								   pDoc->GetLinkFlt(nTab),
1676 								   pDoc->GetLinkOpt(nTab),
1677 								   pDoc->GetLinkTab(nTab),
1678 								   pDoc->GetLinkRefreshDelay(nTab) );
1679 				pRedoDoc->SetTabBgColor( nTab, pDoc->GetTabBgColor(nTab) );
1680 			}
1681 
1682 			pDoc->DeleteAreaTab( aRange,IDF_ALL );
1683 			pUndoDoc->CopyToDocument( aRange, IDF_ALL, sal_False, pDoc );
1684 //			pDoc->TransferDrawPage( pUndoDoc, nTab, nTab );
1685 			pDoc->SetLink( nTab, pUndoDoc->GetLinkMode(nTab), pUndoDoc->GetLinkDoc(nTab),
1686 								 pUndoDoc->GetLinkFlt(nTab),  pUndoDoc->GetLinkOpt(nTab),
1687 								 pUndoDoc->GetLinkTab(nTab),
1688 								 pUndoDoc->GetLinkRefreshDelay(nTab) );
1689 			pDoc->SetTabBgColor( nTab, pUndoDoc->GetTabBgColor(nTab) );
1690 		}
1691 
1692 	pDocShell->PostPaintGridAll();
1693 	pDocShell->PostPaintExtras();
1694 
1695 	EndUndo();
1696 }
1697 
1698 
1699 //----------------------------------------------------------------------------
1700 
Redo()1701 void __EXPORT ScUndoRefreshLink::Redo()
1702 {
1703 	DBG_ASSERT(pRedoDoc, "Kein RedoDoc bei ScUndoRefreshLink::Redo");
1704 
1705 	BeginUndo();
1706 
1707 	ScDocument* pDoc = pDocShell->GetDocument();
1708 	SCTAB nCount = pDoc->GetTableCount();
1709 	for (SCTAB nTab=0; nTab<nCount; nTab++)
1710 		if (pRedoDoc->HasTable(nTab))
1711 		{
1712 			ScRange aRange(0,0,nTab,MAXCOL,MAXROW,nTab);
1713 
1714 			pDoc->DeleteAreaTab( aRange, IDF_ALL );
1715 			pRedoDoc->CopyToDocument( aRange, IDF_ALL, sal_False, pDoc );
1716 //			pDoc->TransferDrawPage( pRedoDoc, nTab, nTab );
1717 			pDoc->SetLink( nTab,
1718 						   pRedoDoc->GetLinkMode(nTab),
1719 						   pRedoDoc->GetLinkDoc(nTab),
1720 						   pRedoDoc->GetLinkFlt(nTab),
1721 						   pRedoDoc->GetLinkOpt(nTab),
1722 						   pRedoDoc->GetLinkTab(nTab),
1723 						   pRedoDoc->GetLinkRefreshDelay(nTab) );
1724 			pDoc->SetTabBgColor( nTab, pRedoDoc->GetTabBgColor(nTab) );
1725 		}
1726 
1727 	pDocShell->PostPaintGridAll();
1728 	pDocShell->PostPaintExtras();
1729 
1730 	EndUndo();
1731 }
1732 
1733 
1734 //----------------------------------------------------------------------------
1735 
Repeat(SfxRepeatTarget &)1736 void __EXPORT ScUndoRefreshLink::Repeat(SfxRepeatTarget& /* rTarget */)
1737 {
1738 	//	gippsnich
1739 }
1740 
1741 
1742 //----------------------------------------------------------------------------
1743 
CanRepeat(SfxRepeatTarget &) const1744 sal_Bool __EXPORT ScUndoRefreshLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1745 {
1746 	return sal_False;
1747 }
1748 
1749 
1750 //----------------------------------------------------------------------------
1751 
lcl_FindAreaLink(sfx2::LinkManager * pLinkManager,const String & rDoc,const String & rFlt,const String & rOpt,const String & rSrc,const ScRange & rDest)1752 ScAreaLink* lcl_FindAreaLink( sfx2::LinkManager* pLinkManager, const String& rDoc,
1753 							const String& rFlt, const String& rOpt,
1754 							const String& rSrc, const ScRange& rDest )
1755 {
1756     const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
1757 	sal_uInt16 nCount = pLinkManager->GetLinks().Count();
1758 	for (sal_uInt16 i=0; i<nCount; i++)
1759 	{
1760         ::sfx2::SvBaseLink* pBase = *rLinks[i];
1761 		if (pBase->ISA(ScAreaLink))
1762 			if ( ((ScAreaLink*)pBase)->IsEqual( rDoc, rFlt, rOpt, rSrc, rDest ) )
1763 				return (ScAreaLink*)pBase;
1764 	}
1765 
1766 	DBG_ERROR("ScAreaLink nicht gefunden");
1767 	return NULL;
1768 }
1769 
1770 
1771 //============================================================================
1772 //	class ScUndoInsertAreaLink
1773 //
1774 //	Bereichs-Verknuepfung einfuegen
1775 
1776 //----------------------------------------------------------------------------
1777 
ScUndoInsertAreaLink(ScDocShell * pShell,const String & rDoc,const String & rFlt,const String & rOpt,const String & rArea,const ScRange & rDestRange,sal_uLong nRefresh)1778 ScUndoInsertAreaLink::ScUndoInsertAreaLink( ScDocShell* pShell,
1779 							const String& rDoc,
1780 							const String& rFlt, const String& rOpt,
1781 							const String& rArea, const ScRange& rDestRange,
1782 							sal_uLong nRefresh )
1783 		//
1784 	:	ScSimpleUndo	( pShell ),
1785 		//
1786 		aDocName		( rDoc ),
1787 		aFltName		( rFlt ),
1788 		aOptions		( rOpt ),
1789 		aAreaName		( rArea ),
1790 		aRange			( rDestRange ),
1791 		nRefreshDelay	( nRefresh )
1792 {
1793 }
1794 
1795 
1796 //----------------------------------------------------------------------------
1797 
~ScUndoInsertAreaLink()1798 __EXPORT ScUndoInsertAreaLink::~ScUndoInsertAreaLink()
1799 {
1800 }
1801 
1802 
1803 //----------------------------------------------------------------------------
1804 
GetComment() const1805 String __EXPORT ScUndoInsertAreaLink::GetComment() const
1806 {
1807 	return ScGlobal::GetRscString( STR_UNDO_INSERTAREALINK );
1808 }
1809 
1810 
1811 //----------------------------------------------------------------------------
1812 
Undo()1813 void __EXPORT ScUndoInsertAreaLink::Undo()
1814 {
1815 	ScDocument* pDoc = pDocShell->GetDocument();
1816 	sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
1817 
1818 	ScAreaLink* pLink = lcl_FindAreaLink( pLinkManager, aDocName, aFltName, aOptions,
1819 											aAreaName, aRange );
1820 	if (pLink)
1821 		pLinkManager->Remove( pLink );
1822 
1823 	SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );		// Navigator
1824 }
1825 
1826 
1827 //----------------------------------------------------------------------------
1828 
Redo()1829 void __EXPORT ScUndoInsertAreaLink::Redo()
1830 {
1831 	ScDocument* pDoc = pDocShell->GetDocument();
1832 	sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
1833 
1834 	ScAreaLink* pLink = new ScAreaLink( pDocShell, aDocName, aFltName, aOptions,
1835 											aAreaName, aRange.aStart, nRefreshDelay );
1836 	pLink->SetInCreate( sal_True );
1837 	pLink->SetDestArea( aRange );
1838 	pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, aDocName, &aFltName, &aAreaName );
1839 	pLink->Update();
1840 	pLink->SetInCreate( sal_False );
1841 
1842 	SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );		// Navigator
1843 }
1844 
1845 
1846 //----------------------------------------------------------------------------
1847 
Repeat(SfxRepeatTarget &)1848 void __EXPORT ScUndoInsertAreaLink::Repeat(SfxRepeatTarget& /* rTarget */)
1849 {
1850 	//!	....
1851 }
1852 
1853 
1854 //----------------------------------------------------------------------------
1855 
CanRepeat(SfxRepeatTarget &) const1856 sal_Bool __EXPORT ScUndoInsertAreaLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1857 {
1858 	return sal_False;
1859 }
1860 
1861 
1862 //============================================================================
1863 //	class ScUndoRemoveAreaLink
1864 //
1865 //	Bereichs-Verknuepfung loeschen
1866 
1867 //----------------------------------------------------------------------------
1868 
ScUndoRemoveAreaLink(ScDocShell * pShell,const String & rDoc,const String & rFlt,const String & rOpt,const String & rArea,const ScRange & rDestRange,sal_uLong nRefresh)1869 ScUndoRemoveAreaLink::ScUndoRemoveAreaLink( ScDocShell* pShell,
1870 							const String& rDoc, const String& rFlt, const String& rOpt,
1871 							const String& rArea, const ScRange& rDestRange,
1872 							sal_uLong nRefresh )
1873 		//
1874 	:	ScSimpleUndo	( pShell ),
1875 		//
1876 		aDocName		( rDoc ),
1877 		aFltName		( rFlt ),
1878 		aOptions		( rOpt ),
1879 		aAreaName		( rArea ),
1880 		aRange			( rDestRange ),
1881 		nRefreshDelay	( nRefresh )
1882 {
1883 }
1884 
1885 
1886 //----------------------------------------------------------------------------
1887 
~ScUndoRemoveAreaLink()1888 __EXPORT ScUndoRemoveAreaLink::~ScUndoRemoveAreaLink()
1889 {
1890 }
1891 
1892 
1893 //----------------------------------------------------------------------------
1894 
GetComment() const1895 String __EXPORT ScUndoRemoveAreaLink::GetComment() const
1896 {
1897 	return ScGlobal::GetRscString( STR_UNDO_REMOVELINK );	//! eigener Text ??
1898 }
1899 
1900 
1901 //----------------------------------------------------------------------------
1902 
Undo()1903 void __EXPORT ScUndoRemoveAreaLink::Undo()
1904 {
1905 	ScDocument* pDoc = pDocShell->GetDocument();
1906 	sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
1907 
1908 	ScAreaLink* pLink = new ScAreaLink( pDocShell, aDocName, aFltName, aOptions,
1909 										aAreaName, aRange.aStart, nRefreshDelay );
1910 	pLink->SetInCreate( sal_True );
1911 	pLink->SetDestArea( aRange );
1912 	pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, aDocName, &aFltName, &aAreaName );
1913 	pLink->Update();
1914 	pLink->SetInCreate( sal_False );
1915 
1916 	SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );		// Navigator
1917 }
1918 
1919 
1920 //----------------------------------------------------------------------------
1921 
Redo()1922 void __EXPORT ScUndoRemoveAreaLink::Redo()
1923 {
1924 	ScDocument* pDoc = pDocShell->GetDocument();
1925 	sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
1926 
1927 	ScAreaLink* pLink = lcl_FindAreaLink( pLinkManager, aDocName, aFltName, aOptions,
1928 											aAreaName, aRange );
1929 	if (pLink)
1930 		pLinkManager->Remove( pLink );
1931 
1932 	SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );		// Navigator
1933 }
1934 
1935 
1936 //----------------------------------------------------------------------------
1937 
Repeat(SfxRepeatTarget &)1938 void __EXPORT ScUndoRemoveAreaLink::Repeat(SfxRepeatTarget& /* rTarget */)
1939 {
1940 	//	gippsnich
1941 }
1942 
1943 
1944 //----------------------------------------------------------------------------
1945 
CanRepeat(SfxRepeatTarget &) const1946 sal_Bool __EXPORT ScUndoRemoveAreaLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1947 {
1948 	return sal_False;
1949 }
1950 
1951 
1952 //============================================================================
1953 //	class ScUndoUpdateAreaLink
1954 //
1955 //	Bereichs-Verknuepfung aktualisieren
1956 
1957 //----------------------------------------------------------------------------
1958 
ScUndoUpdateAreaLink(ScDocShell * pShell,const String & rOldD,const String & rOldF,const String & rOldO,const String & rOldA,const ScRange & rOldR,sal_uLong nOldRD,const String & rNewD,const String & rNewF,const String & rNewO,const String & rNewA,const ScRange & rNewR,sal_uLong nNewRD,ScDocument * pUndo,ScDocument * pRedo,sal_Bool bDoInsert)1959 ScUndoUpdateAreaLink::ScUndoUpdateAreaLink( ScDocShell* pShell,
1960 							const String& rOldD, const String& rOldF, const String& rOldO,
1961 							const String& rOldA, const ScRange& rOldR, sal_uLong nOldRD,
1962 							const String& rNewD, const String& rNewF, const String& rNewO,
1963 							const String& rNewA, const ScRange& rNewR, sal_uLong nNewRD,
1964 							ScDocument* pUndo, ScDocument* pRedo, sal_Bool bDoInsert )
1965 		//
1966 	:	ScSimpleUndo( pShell ),
1967 		//
1968 		aOldDoc		( rOldD ),
1969 		aOldFlt		( rOldF ),
1970 		aOldOpt		( rOldO ),
1971 		aOldArea	( rOldA ),
1972 		aOldRange	( rOldR ),
1973 		aNewDoc		( rNewD ),
1974 		aNewFlt		( rNewF ),
1975 		aNewOpt		( rNewO ),
1976 		aNewArea	( rNewA ),
1977 		aNewRange	( rNewR ),
1978 		pUndoDoc	( pUndo ),
1979 		pRedoDoc	( pRedo ),
1980 		nOldRefresh	( nOldRD ),
1981 		nNewRefresh	( nNewRD ),
1982 		bWithInsert	( bDoInsert )
1983 {
1984 	DBG_ASSERT( aOldRange.aStart == aNewRange.aStart, "AreaLink verschoben ?" );
1985 }
1986 
1987 
1988 //----------------------------------------------------------------------------
1989 
~ScUndoUpdateAreaLink()1990 __EXPORT ScUndoUpdateAreaLink::~ScUndoUpdateAreaLink()
1991 {
1992 	delete pUndoDoc;
1993 	delete pRedoDoc;
1994 }
1995 
1996 
1997 //----------------------------------------------------------------------------
1998 
GetComment() const1999 String __EXPORT ScUndoUpdateAreaLink::GetComment() const
2000 {
2001 	return ScGlobal::GetRscString( STR_UNDO_UPDATELINK );	//! eigener Text ??
2002 }
2003 
2004 
2005 //----------------------------------------------------------------------------
2006 
DoChange(const sal_Bool bUndo) const2007 void ScUndoUpdateAreaLink::DoChange( const sal_Bool bUndo ) const
2008 {
2009 	ScDocument* pDoc = pDocShell->GetDocument();
2010 
2011 	SCCOL nEndX = Max( aOldRange.aEnd.Col(), aNewRange.aEnd.Col() );
2012 	SCROW nEndY = Max( aOldRange.aEnd.Row(), aNewRange.aEnd.Row() );
2013 	SCTAB nEndZ = Max( aOldRange.aEnd.Tab(), aNewRange.aEnd.Tab() );	//?
2014 
2015 	if ( bUndo )
2016 	{
2017 		if ( bWithInsert )
2018 		{
2019 			pDoc->FitBlock( aNewRange, aOldRange );
2020             pDoc->DeleteAreaTab( aOldRange, IDF_ALL & ~IDF_NOTE );
2021             pUndoDoc->UndoToDocument( aOldRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc );
2022 		}
2023 		else
2024 		{
2025 			ScRange aCopyRange( aOldRange.aStart, ScAddress(nEndX,nEndY,nEndZ) );
2026             pDoc->DeleteAreaTab( aCopyRange, IDF_ALL & ~IDF_NOTE );
2027             pUndoDoc->CopyToDocument( aCopyRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc );
2028 		}
2029 	}
2030 	else
2031 	{
2032 		if ( bWithInsert )
2033 		{
2034 			pDoc->FitBlock( aOldRange, aNewRange );
2035             pDoc->DeleteAreaTab( aNewRange, IDF_ALL & ~IDF_NOTE );
2036             pRedoDoc->CopyToDocument( aNewRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc );
2037 		}
2038 		else
2039 		{
2040 			ScRange aCopyRange( aOldRange.aStart, ScAddress(nEndX,nEndY,nEndZ) );
2041             pDoc->DeleteAreaTab( aCopyRange, IDF_ALL & ~IDF_NOTE );
2042             pRedoDoc->CopyToDocument( aCopyRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc );
2043 		}
2044 	}
2045 
2046 	ScRange aWorkRange( aNewRange.aStart, ScAddress( nEndX, nEndY, nEndZ ) );
2047 	pDoc->ExtendMerge( aWorkRange, sal_True );
2048 
2049 	//	Paint
2050 
2051 	if ( aNewRange.aEnd.Col() != aOldRange.aEnd.Col() )
2052 		aWorkRange.aEnd.SetCol(MAXCOL);
2053 	if ( aNewRange.aEnd.Row() != aOldRange.aEnd.Row() )
2054 		aWorkRange.aEnd.SetRow(MAXROW);
2055 
2056 	if ( !pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), aWorkRange.aStart.Tab() ) )
2057 		pDocShell->PostPaint( aWorkRange, PAINT_GRID );
2058 
2059 	pDocShell->PostDataChanged();
2060 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2061 	if (pViewShell)
2062 		pViewShell->CellContentChanged();
2063 }
2064 
2065 
2066 //----------------------------------------------------------------------------
2067 
Undo()2068 void __EXPORT ScUndoUpdateAreaLink::Undo()
2069 {
2070 	ScDocument* pDoc = pDocShell->GetDocument();
2071 	sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
2072 	ScAreaLink* pLink = lcl_FindAreaLink( pLinkManager, aNewDoc, aNewFlt, aNewOpt,
2073 											aNewArea, aNewRange );
2074 	if (pLink)
2075 	{
2076 		pLink->SetSource( aOldDoc, aOldFlt, aOldOpt, aOldArea );		// alte Werte im Link
2077 		pLink->SetDestArea( aOldRange );
2078 		pLink->SetRefreshDelay( nOldRefresh );
2079 	}
2080 
2081 	DoChange(sal_True);
2082 }
2083 
2084 
2085 //----------------------------------------------------------------------------
2086 
Redo()2087 void __EXPORT ScUndoUpdateAreaLink::Redo()
2088 {
2089 	ScDocument* pDoc = pDocShell->GetDocument();
2090 	sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
2091 	ScAreaLink* pLink = lcl_FindAreaLink( pLinkManager, aOldDoc, aOldFlt, aOldOpt,
2092 											aOldArea, aOldRange );
2093 	if (pLink)
2094 	{
2095 		pLink->SetSource( aNewDoc, aNewFlt, aNewOpt, aNewArea );		// neue Werte im Link
2096 		pLink->SetDestArea( aNewRange );
2097 		pLink->SetRefreshDelay( nNewRefresh );
2098 	}
2099 
2100 	DoChange(sal_False);
2101 }
2102 
2103 
2104 //----------------------------------------------------------------------------
2105 
Repeat(SfxRepeatTarget &)2106 void __EXPORT ScUndoUpdateAreaLink::Repeat(SfxRepeatTarget& /* rTarget */)
2107 {
2108 	//	gippsnich
2109 }
2110 
2111 
2112 //----------------------------------------------------------------------------
2113 
CanRepeat(SfxRepeatTarget &) const2114 sal_Bool __EXPORT ScUndoUpdateAreaLink::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2115 {
2116 	return sal_False;
2117 }
2118 
2119 
2120 
2121 
2122