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