xref: /AOO41X/main/sc/source/ui/undo/undoblk.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b3f79822SAndrew Rist  * distributed with this work for additional information
6*b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b3f79822SAndrew Rist  * specific language governing permissions and limitations
18*b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*b3f79822SAndrew Rist  *************************************************************/
21*b3f79822SAndrew Rist 
22*b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir 
29cdf0e10cSrcweir //------------------------------------------------------------------
30cdf0e10cSrcweir 
31cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include "scitems.hxx"
34cdf0e10cSrcweir #include <vcl/virdev.hxx>
35cdf0e10cSrcweir #include <vcl/waitobj.hxx>
36cdf0e10cSrcweir #include <editeng/boxitem.hxx>
37cdf0e10cSrcweir #include <sfx2/app.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include "undoblk.hxx"
40cdf0e10cSrcweir #include "undoutil.hxx"
41cdf0e10cSrcweir #include "document.hxx"
42cdf0e10cSrcweir #include "patattr.hxx"
43cdf0e10cSrcweir #include "docsh.hxx"
44cdf0e10cSrcweir #include "tabvwsh.hxx"
45cdf0e10cSrcweir #include "rangenam.hxx"
46cdf0e10cSrcweir #include "rangeutl.hxx"
47cdf0e10cSrcweir #include "dbcolect.hxx"
48cdf0e10cSrcweir #include "stlpool.hxx"
49cdf0e10cSrcweir #include "stlsheet.hxx"
50cdf0e10cSrcweir #include "globstr.hrc"
51cdf0e10cSrcweir #include "global.hxx"
52cdf0e10cSrcweir #include "target.hxx"
53cdf0e10cSrcweir #include "docpool.hxx"
54cdf0e10cSrcweir #include "docfunc.hxx"
55cdf0e10cSrcweir #include "attrib.hxx"
56cdf0e10cSrcweir #include "chgtrack.hxx"
57cdf0e10cSrcweir #include "transobj.hxx"
58cdf0e10cSrcweir #include "refundo.hxx"
59cdf0e10cSrcweir #include "undoolk.hxx"
60cdf0e10cSrcweir #include "clipparam.hxx"
61cdf0e10cSrcweir #include "sc.hrc"
62cdf0e10cSrcweir 
63cdf0e10cSrcweir 
64cdf0e10cSrcweir // STATIC DATA -----------------------------------------------------------
65cdf0e10cSrcweir 
66cdf0e10cSrcweir TYPEINIT1(ScUndoInsertCells,		SfxUndoAction);
67cdf0e10cSrcweir TYPEINIT1(ScUndoDeleteCells,		SfxUndoAction);
68cdf0e10cSrcweir TYPEINIT1(ScUndoDeleteMulti,		SfxUndoAction);
69cdf0e10cSrcweir TYPEINIT1(ScUndoCut,				ScBlockUndo);
70cdf0e10cSrcweir TYPEINIT1(ScUndoPaste,				SfxUndoAction);
71cdf0e10cSrcweir TYPEINIT1(ScUndoDragDrop,			SfxUndoAction);
72cdf0e10cSrcweir TYPEINIT1(ScUndoListNames,			SfxUndoAction);
73cdf0e10cSrcweir TYPEINIT1(ScUndoUseScenario,		SfxUndoAction);
74cdf0e10cSrcweir TYPEINIT1(ScUndoSelectionStyle,		SfxUndoAction);
75cdf0e10cSrcweir TYPEINIT1(ScUndoEnterMatrix,		ScBlockUndo);
76cdf0e10cSrcweir TYPEINIT1(ScUndoIndent,				ScBlockUndo);
77cdf0e10cSrcweir TYPEINIT1(ScUndoTransliterate,		ScBlockUndo);
78cdf0e10cSrcweir TYPEINIT1(ScUndoClearItems,			ScBlockUndo);
79cdf0e10cSrcweir TYPEINIT1(ScUndoRemoveBreaks,		SfxUndoAction);
80cdf0e10cSrcweir TYPEINIT1(ScUndoRemoveMerge,		ScBlockUndo);
81cdf0e10cSrcweir TYPEINIT1(ScUndoBorder,				ScBlockUndo);
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 
85cdf0e10cSrcweir // To Do:
86cdf0e10cSrcweir /*A*/	// SetOptimalHeight auf Dokument, wenn keine View
87cdf0e10cSrcweir /*B*/	// gelinkte Tabellen
88cdf0e10cSrcweir /*C*/	// ScArea
89cdf0e10cSrcweir //?		// spaeter mal pruefen
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 
92cdf0e10cSrcweir // -----------------------------------------------------------------------
93cdf0e10cSrcweir //
94cdf0e10cSrcweir //		Zellen einfuegen
95cdf0e10cSrcweir //      Zeilen einfuegen
96cdf0e10cSrcweir //		einzeln oder Block
97cdf0e10cSrcweir //
98cdf0e10cSrcweir 
ScUndoInsertCells(ScDocShell * pNewDocShell,const ScRange & rRange,SCTAB nNewCount,SCTAB * pNewTabs,SCTAB * pNewScenarios,InsCellCmd eNewCmd,ScDocument * pUndoDocument,ScRefUndoData * pRefData,sal_Bool bNewPartOfPaste)99cdf0e10cSrcweir ScUndoInsertCells::ScUndoInsertCells( ScDocShell* pNewDocShell,
100cdf0e10cSrcweir 								const ScRange& rRange, SCTAB nNewCount, SCTAB* pNewTabs, SCTAB* pNewScenarios,
101cdf0e10cSrcweir                                 InsCellCmd eNewCmd, ScDocument* pUndoDocument, ScRefUndoData* pRefData,
102cdf0e10cSrcweir 								sal_Bool bNewPartOfPaste ) :
103cdf0e10cSrcweir 	ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ),
104cdf0e10cSrcweir 	aEffRange( rRange ),
105cdf0e10cSrcweir     nCount( nNewCount ),
106cdf0e10cSrcweir     pTabs( pNewTabs ),
107cdf0e10cSrcweir     pScenarios( pNewScenarios ),
108cdf0e10cSrcweir 	eCmd( eNewCmd ),
109cdf0e10cSrcweir 	bPartOfPaste( bNewPartOfPaste ),
110cdf0e10cSrcweir 	pPasteUndo( NULL )
111cdf0e10cSrcweir {
112cdf0e10cSrcweir 	if (eCmd == INS_INSROWS)			// ganze Zeilen?
113cdf0e10cSrcweir 	{
114cdf0e10cSrcweir 		aEffRange.aStart.SetCol(0);
115cdf0e10cSrcweir 		aEffRange.aEnd.SetCol(MAXCOL);
116cdf0e10cSrcweir 	}
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 	if (eCmd == INS_INSCOLS)			// ganze Spalten?
119cdf0e10cSrcweir 	{
120cdf0e10cSrcweir 		aEffRange.aStart.SetRow(0);
121cdf0e10cSrcweir 		aEffRange.aEnd.SetRow(MAXROW);
122cdf0e10cSrcweir 	}
123cdf0e10cSrcweir 
124cdf0e10cSrcweir 	SetChangeTrack();
125cdf0e10cSrcweir }
126cdf0e10cSrcweir 
~ScUndoInsertCells()127cdf0e10cSrcweir __EXPORT ScUndoInsertCells::~ScUndoInsertCells()
128cdf0e10cSrcweir {
129cdf0e10cSrcweir 	delete pPasteUndo;
130cdf0e10cSrcweir     delete []pTabs;
131cdf0e10cSrcweir     delete []pScenarios;
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
GetComment() const134cdf0e10cSrcweir String __EXPORT ScUndoInsertCells::GetComment() const
135cdf0e10cSrcweir {
136cdf0e10cSrcweir 	return ScGlobal::GetRscString( pPasteUndo ? STR_UNDO_PASTE : STR_UNDO_INSERTCELLS );
137cdf0e10cSrcweir }
138cdf0e10cSrcweir 
Merge(SfxUndoAction * pNextAction)139cdf0e10cSrcweir sal_Bool ScUndoInsertCells::Merge( SfxUndoAction* pNextAction )
140cdf0e10cSrcweir {
141cdf0e10cSrcweir 	//	If a paste undo action has already been added, append (detective) action there.
142cdf0e10cSrcweir 	if ( pPasteUndo )
143cdf0e10cSrcweir 		return pPasteUndo->Merge( pNextAction );
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 	if ( bPartOfPaste && pNextAction->ISA( ScUndoWrapper ) )
146cdf0e10cSrcweir 	{
147cdf0e10cSrcweir 		ScUndoWrapper* pWrapper = (ScUndoWrapper*)pNextAction;
148cdf0e10cSrcweir 		SfxUndoAction* pWrappedAction = pWrapper->GetWrappedUndo();
149cdf0e10cSrcweir 		if ( pWrappedAction && pWrappedAction->ISA( ScUndoPaste ) )
150cdf0e10cSrcweir 		{
151cdf0e10cSrcweir 			//	Store paste action if this is part of paste with inserting cells.
152cdf0e10cSrcweir 			//	A list action isn't used because Repeat wouldn't work (insert wrong cells).
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 			pPasteUndo = pWrappedAction;
155cdf0e10cSrcweir 			pWrapper->ForgetWrappedUndo();		// pWrapper is deleted by UndoManager
156cdf0e10cSrcweir 			return sal_True;
157cdf0e10cSrcweir 		}
158cdf0e10cSrcweir 	}
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 	//	Call base class for detective handling
161cdf0e10cSrcweir 	return ScMoveUndo::Merge( pNextAction );
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
SetChangeTrack()164cdf0e10cSrcweir void ScUndoInsertCells::SetChangeTrack()
165cdf0e10cSrcweir {
166cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
167cdf0e10cSrcweir 	if ( pChangeTrack )
168cdf0e10cSrcweir 	{
169cdf0e10cSrcweir 		pChangeTrack->AppendInsert( aEffRange );
170cdf0e10cSrcweir 		nEndChangeAction = pChangeTrack->GetActionMax();
171cdf0e10cSrcweir 	}
172cdf0e10cSrcweir 	else
173cdf0e10cSrcweir 		nEndChangeAction = 0;
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
DoChange(const sal_Bool bUndo)176cdf0e10cSrcweir void ScUndoInsertCells::DoChange( const sal_Bool bUndo )
177cdf0e10cSrcweir {
178cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
179cdf0e10cSrcweir     SCTAB i;
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 	if ( bUndo )
182cdf0e10cSrcweir 	{
183cdf0e10cSrcweir 		ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
184cdf0e10cSrcweir 		if ( pChangeTrack )
185cdf0e10cSrcweir 			pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
186cdf0e10cSrcweir 	}
187cdf0e10cSrcweir 	else
188cdf0e10cSrcweir 		SetChangeTrack();
189cdf0e10cSrcweir 
190cdf0e10cSrcweir     // refresh of merged cells has to be after inserting/deleting
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 	switch (eCmd)
193cdf0e10cSrcweir 	{
194cdf0e10cSrcweir 		case INS_INSROWS:
195cdf0e10cSrcweir 		case INS_CELLSDOWN:
196cdf0e10cSrcweir             for( i=0; i<nCount; i++ )
197cdf0e10cSrcweir             {
198cdf0e10cSrcweir                 if (bUndo)
199cdf0e10cSrcweir                     pDoc->DeleteRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i],
200cdf0e10cSrcweir                     aEffRange.aStart.Row(), static_cast<SCSIZE>(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1));
201cdf0e10cSrcweir                 else
202cdf0e10cSrcweir                     pDoc->InsertRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i],
203cdf0e10cSrcweir                     aEffRange.aStart.Row(), static_cast<SCSIZE>(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1));
204cdf0e10cSrcweir             }
205cdf0e10cSrcweir             break;
206cdf0e10cSrcweir 		case INS_INSCOLS:
207cdf0e10cSrcweir 		case INS_CELLSRIGHT:
208cdf0e10cSrcweir             for( i=0; i<nCount; i++ )
209cdf0e10cSrcweir             {
210cdf0e10cSrcweir                 if (bUndo)
211cdf0e10cSrcweir                     pDoc->DeleteCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
212cdf0e10cSrcweir                     aEffRange.aStart.Col(), static_cast<SCSIZE>(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1));
213cdf0e10cSrcweir                 else
214cdf0e10cSrcweir                     pDoc->InsertCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
215cdf0e10cSrcweir                     aEffRange.aStart.Col(), static_cast<SCSIZE>(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1));
216cdf0e10cSrcweir             }
217cdf0e10cSrcweir             break;
218cdf0e10cSrcweir         default:
219cdf0e10cSrcweir         {
220cdf0e10cSrcweir             // added to avoid warnings
221cdf0e10cSrcweir         }
222cdf0e10cSrcweir 	}
223cdf0e10cSrcweir 
224cdf0e10cSrcweir     ScRange aWorkRange( aEffRange );
225cdf0e10cSrcweir     if ( eCmd == INS_CELLSRIGHT )                   // only "shift right" requires refresh of the moved area
226cdf0e10cSrcweir         aWorkRange.aEnd.SetCol(MAXCOL);
227cdf0e10cSrcweir     for( i=0; i<nCount; i++ )
228cdf0e10cSrcweir     {
229cdf0e10cSrcweir         if ( pDoc->HasAttrib( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i],
230cdf0e10cSrcweir             aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i], HASATTR_MERGED ) )
231cdf0e10cSrcweir         {
232cdf0e10cSrcweir             SCCOL nEndCol = aWorkRange.aEnd.Col();
233cdf0e10cSrcweir             SCROW nEndRow = aWorkRange.aEnd.Row();
234cdf0e10cSrcweir             pDoc->ExtendMerge( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), nEndCol, nEndRow, pTabs[i], sal_True );
235cdf0e10cSrcweir         }
236cdf0e10cSrcweir     }
237cdf0e10cSrcweir 
238cdf0e10cSrcweir //?	Undo fuer herausgeschobene Attribute ?
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 	sal_uInt16 nPaint = PAINT_GRID;
241cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
242cdf0e10cSrcweir 	switch (eCmd)
243cdf0e10cSrcweir 	{
244cdf0e10cSrcweir 		case INS_INSROWS:
245cdf0e10cSrcweir 			nPaint |= PAINT_LEFT;
246cdf0e10cSrcweir 			aWorkRange.aEnd.SetRow(MAXROW);
247cdf0e10cSrcweir 			break;
248cdf0e10cSrcweir 		case INS_CELLSDOWN:
249cdf0e10cSrcweir             for( i=0; i<nCount; i++ )
250cdf0e10cSrcweir             {
251cdf0e10cSrcweir                 aWorkRange.aEnd.SetRow(MAXROW);
252cdf0e10cSrcweir                 if ( pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] ))
253cdf0e10cSrcweir                 {
254cdf0e10cSrcweir                     aWorkRange.aStart.SetCol(0);
255cdf0e10cSrcweir                     aWorkRange.aEnd.SetCol(MAXCOL);
256cdf0e10cSrcweir                     nPaint |= PAINT_LEFT;
257cdf0e10cSrcweir                 }
258cdf0e10cSrcweir             }
259cdf0e10cSrcweir             break;
260cdf0e10cSrcweir 		case INS_INSCOLS:
261cdf0e10cSrcweir 			nPaint |= PAINT_TOP;				// obere Leiste
262cdf0e10cSrcweir 		case INS_CELLSRIGHT:
263cdf0e10cSrcweir             for( i=0; i<nCount; i++ )
264cdf0e10cSrcweir             {
265cdf0e10cSrcweir                 aWorkRange.aEnd.SetCol(MAXCOL);		// bis ganz nach rechts
266cdf0e10cSrcweir                 if ( pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i]) )
267cdf0e10cSrcweir                 {									// AdjustDraw zeichnet PAINT_TOP nicht,
268cdf0e10cSrcweir                     aWorkRange.aStart.SetCol(0);	// daher so geloest
269cdf0e10cSrcweir                     aWorkRange.aEnd.SetRow(MAXROW);
270cdf0e10cSrcweir                     nPaint |= PAINT_LEFT;
271cdf0e10cSrcweir                 }
272cdf0e10cSrcweir             }
273cdf0e10cSrcweir             break;
274cdf0e10cSrcweir         default:
275cdf0e10cSrcweir         {
276cdf0e10cSrcweir             // added to avoid warnings
277cdf0e10cSrcweir         }
278cdf0e10cSrcweir 	}
279cdf0e10cSrcweir 
280cdf0e10cSrcweir     for( i=0; i<nCount; i++ )
281cdf0e10cSrcweir     {
282cdf0e10cSrcweir         pDocShell->PostPaint( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i],
283cdf0e10cSrcweir             aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i]+pScenarios[i], nPaint );
284cdf0e10cSrcweir     }
285cdf0e10cSrcweir 	pDocShell->PostDataChanged();
286cdf0e10cSrcweir 	if (pViewShell)
287cdf0e10cSrcweir 		pViewShell->CellContentChanged();
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
Undo()290cdf0e10cSrcweir void __EXPORT ScUndoInsertCells::Undo()
291cdf0e10cSrcweir {
292cdf0e10cSrcweir 	if ( pPasteUndo )
293cdf0e10cSrcweir 		pPasteUndo->Undo();		// undo paste first
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 	WaitObject aWait( pDocShell->GetActiveDialogParent() );		// wichtig wegen TrackFormulas bei UpdateReference
296cdf0e10cSrcweir 	BeginUndo();
297cdf0e10cSrcweir 	DoChange( sal_True );
298cdf0e10cSrcweir 	EndUndo();
299cdf0e10cSrcweir }
300cdf0e10cSrcweir 
Redo()301cdf0e10cSrcweir void __EXPORT ScUndoInsertCells::Redo()
302cdf0e10cSrcweir {
303cdf0e10cSrcweir 	WaitObject aWait( pDocShell->GetActiveDialogParent() );		// wichtig wegen TrackFormulas bei UpdateReference
304cdf0e10cSrcweir 	BeginRedo();
305cdf0e10cSrcweir 	DoChange( sal_False );
306cdf0e10cSrcweir 	EndRedo();
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 	if ( pPasteUndo )
309cdf0e10cSrcweir 		pPasteUndo->Redo();		// redo paste last
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)312cdf0e10cSrcweir void __EXPORT ScUndoInsertCells::Repeat(SfxRepeatTarget& rTarget)
313cdf0e10cSrcweir {
314cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
315cdf0e10cSrcweir 	{
316cdf0e10cSrcweir 		if ( pPasteUndo )
317cdf0e10cSrcweir 		{
318cdf0e10cSrcweir 			//	#94115# Repeat for paste with inserting cells is handled completely
319cdf0e10cSrcweir 			//	by the Paste undo action
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 			pPasteUndo->Repeat( rTarget );
322cdf0e10cSrcweir 		}
323cdf0e10cSrcweir 		else
324cdf0e10cSrcweir 			((ScTabViewTarget&)rTarget).GetViewShell()->InsertCells( eCmd, sal_True );
325cdf0e10cSrcweir 	}
326cdf0e10cSrcweir }
327cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const328cdf0e10cSrcweir sal_Bool __EXPORT ScUndoInsertCells::CanRepeat(SfxRepeatTarget& rTarget) const
329cdf0e10cSrcweir {
330cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
331cdf0e10cSrcweir }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir 
334cdf0e10cSrcweir // -----------------------------------------------------------------------
335cdf0e10cSrcweir //
336cdf0e10cSrcweir //		Zellen loeschen
337cdf0e10cSrcweir //      Zeilen loeschen
338cdf0e10cSrcweir //		einzeln oder Block
339cdf0e10cSrcweir //
340cdf0e10cSrcweir 
ScUndoDeleteCells(ScDocShell * pNewDocShell,const ScRange & rRange,SCTAB nNewCount,SCTAB * pNewTabs,SCTAB * pNewScenarios,DelCellCmd eNewCmd,ScDocument * pUndoDocument,ScRefUndoData * pRefData)341cdf0e10cSrcweir ScUndoDeleteCells::ScUndoDeleteCells( ScDocShell* pNewDocShell,
342cdf0e10cSrcweir 								const ScRange& rRange, SCTAB nNewCount, SCTAB* pNewTabs, SCTAB* pNewScenarios,
343cdf0e10cSrcweir                                 DelCellCmd eNewCmd, ScDocument* pUndoDocument, ScRefUndoData* pRefData ) :
344cdf0e10cSrcweir 	ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ),
345cdf0e10cSrcweir 	aEffRange( rRange ),
346cdf0e10cSrcweir     nCount( nNewCount ),
347cdf0e10cSrcweir     pTabs( pNewTabs ),
348cdf0e10cSrcweir     pScenarios( pNewScenarios ),
349cdf0e10cSrcweir 	eCmd( eNewCmd )
350cdf0e10cSrcweir {
351cdf0e10cSrcweir 	if (eCmd == DEL_DELROWS)			// gaze Zeilen?
352cdf0e10cSrcweir 	{
353cdf0e10cSrcweir 		aEffRange.aStart.SetCol(0);
354cdf0e10cSrcweir 		aEffRange.aEnd.SetCol(MAXCOL);
355cdf0e10cSrcweir 	}
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 	if (eCmd == DEL_DELCOLS)			// ganze Spalten?
358cdf0e10cSrcweir 	{
359cdf0e10cSrcweir 		aEffRange.aStart.SetRow(0);
360cdf0e10cSrcweir 		aEffRange.aEnd.SetRow(MAXROW);
361cdf0e10cSrcweir 	}
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 	SetChangeTrack();
364cdf0e10cSrcweir }
365cdf0e10cSrcweir 
~ScUndoDeleteCells()366cdf0e10cSrcweir __EXPORT ScUndoDeleteCells::~ScUndoDeleteCells()
367cdf0e10cSrcweir {
368cdf0e10cSrcweir     delete []pTabs;
369cdf0e10cSrcweir     delete []pScenarios;
370cdf0e10cSrcweir }
371cdf0e10cSrcweir 
GetComment() const372cdf0e10cSrcweir String __EXPORT ScUndoDeleteCells::GetComment() const
373cdf0e10cSrcweir {
374cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_DELETECELLS ); // "Loeschen"
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
SetChangeTrack()377cdf0e10cSrcweir void ScUndoDeleteCells::SetChangeTrack()
378cdf0e10cSrcweir {
379cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
380cdf0e10cSrcweir 	if ( pChangeTrack )
381cdf0e10cSrcweir 		pChangeTrack->AppendDeleteRange( aEffRange, pRefUndoDoc,
382cdf0e10cSrcweir 			nStartChangeAction, nEndChangeAction );
383cdf0e10cSrcweir 	else
384cdf0e10cSrcweir 		nStartChangeAction = nEndChangeAction = 0;
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
DoChange(const sal_Bool bUndo)387cdf0e10cSrcweir void ScUndoDeleteCells::DoChange( const sal_Bool bUndo )
388cdf0e10cSrcweir {
389cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
390cdf0e10cSrcweir     SCTAB i;
391cdf0e10cSrcweir 
392cdf0e10cSrcweir 	if ( bUndo )
393cdf0e10cSrcweir 	{
394cdf0e10cSrcweir 		ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
395cdf0e10cSrcweir 		if ( pChangeTrack )
396cdf0e10cSrcweir 			pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
397cdf0e10cSrcweir 	}
398cdf0e10cSrcweir 	else
399cdf0e10cSrcweir 		SetChangeTrack();
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 	// Ausfuehren
402cdf0e10cSrcweir 	switch (eCmd)
403cdf0e10cSrcweir 	{
404cdf0e10cSrcweir 		case DEL_DELROWS:
405cdf0e10cSrcweir 		case DEL_CELLSUP:
406cdf0e10cSrcweir             for( i=0; i<nCount; i++ )
407cdf0e10cSrcweir             {
408cdf0e10cSrcweir                 if (bUndo)
409cdf0e10cSrcweir                     pDoc->InsertRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i],
410cdf0e10cSrcweir                     aEffRange.aStart.Row(), static_cast<SCSIZE>(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1));
411cdf0e10cSrcweir                 else
412cdf0e10cSrcweir                     pDoc->DeleteRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i],
413cdf0e10cSrcweir                     aEffRange.aStart.Row(), static_cast<SCSIZE>(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1));
414cdf0e10cSrcweir             }
415cdf0e10cSrcweir             break;
416cdf0e10cSrcweir 		case DEL_DELCOLS:
417cdf0e10cSrcweir 		case DEL_CELLSLEFT:
418cdf0e10cSrcweir             for( i=0; i<nCount; i++ )
419cdf0e10cSrcweir             {
420cdf0e10cSrcweir                 if (bUndo)
421cdf0e10cSrcweir                     pDoc->InsertCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
422cdf0e10cSrcweir                     aEffRange.aStart.Col(), static_cast<SCSIZE>(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1));
423cdf0e10cSrcweir                 else
424cdf0e10cSrcweir                     pDoc->DeleteCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
425cdf0e10cSrcweir                     aEffRange.aStart.Col(), static_cast<SCSIZE>(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1));
426cdf0e10cSrcweir             }
427cdf0e10cSrcweir             break;
428cdf0e10cSrcweir         default:
429cdf0e10cSrcweir         {
430cdf0e10cSrcweir             // added to avoid warnings
431cdf0e10cSrcweir         }
432cdf0e10cSrcweir 	}
433cdf0e10cSrcweir 
434cdf0e10cSrcweir 	// bei Undo Referenzen wiederherstellen
435cdf0e10cSrcweir     for( i=0; i<nCount && bUndo; i++ )
436cdf0e10cSrcweir     {
437cdf0e10cSrcweir         pRefUndoDoc->CopyToDocument( aEffRange.aStart.Col(), aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Col(), aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
438cdf0e10cSrcweir             IDF_ALL | IDF_NOCAPTIONS, sal_False, pDoc );
439cdf0e10cSrcweir     }
440cdf0e10cSrcweir 
441cdf0e10cSrcweir     ScRange aWorkRange( aEffRange );
442cdf0e10cSrcweir     if ( eCmd == DEL_CELLSLEFT )        // only "shift left" requires refresh of the moved area
443cdf0e10cSrcweir         aWorkRange.aEnd.SetCol(MAXCOL);
444cdf0e10cSrcweir 
445cdf0e10cSrcweir     for( i=0; i<nCount; i++ )
446cdf0e10cSrcweir     {
447cdf0e10cSrcweir         if ( pDoc->HasAttrib( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i],
448cdf0e10cSrcweir             aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i], HASATTR_MERGED | HASATTR_OVERLAPPED ) )
449cdf0e10cSrcweir         {
450cdf0e10cSrcweir             // #i51445# old merge flag attributes must be deleted also for single cells,
451cdf0e10cSrcweir             // not only for whole columns/rows
452cdf0e10cSrcweir 
453cdf0e10cSrcweir             if ( !bUndo )
454cdf0e10cSrcweir             {
455cdf0e10cSrcweir                 if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT )
456cdf0e10cSrcweir                     aWorkRange.aEnd.SetCol(MAXCOL);
457cdf0e10cSrcweir                 if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP )
458cdf0e10cSrcweir                     aWorkRange.aEnd.SetRow(MAXROW);
459cdf0e10cSrcweir                 ScMarkData aMarkData;
460cdf0e10cSrcweir                 aMarkData.SelectOneTable( aWorkRange.aStart.Tab() );
461cdf0e10cSrcweir                 ScPatternAttr aPattern( pDoc->GetPool() );
462cdf0e10cSrcweir                 aPattern.GetItemSet().Put( ScMergeFlagAttr() );
463cdf0e10cSrcweir                 pDoc->ApplyPatternArea( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(),
464cdf0e10cSrcweir                     aWorkRange.aEnd.Col(),   aWorkRange.aEnd.Row(),
465cdf0e10cSrcweir                     aMarkData, aPattern );
466cdf0e10cSrcweir             }
467cdf0e10cSrcweir 
468cdf0e10cSrcweir             SCCOL nEndCol = aWorkRange.aEnd.Col();
469cdf0e10cSrcweir             SCROW nEndRow = aWorkRange.aEnd.Row();
470cdf0e10cSrcweir             pDoc->ExtendMerge( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), nEndCol, nEndRow, pTabs[i], sal_True );
471cdf0e10cSrcweir         }
472cdf0e10cSrcweir     }
473cdf0e10cSrcweir 
474cdf0e10cSrcweir 	// Zeichnen
475cdf0e10cSrcweir 	sal_uInt16 nPaint = PAINT_GRID;
476cdf0e10cSrcweir 	switch (eCmd)
477cdf0e10cSrcweir 	{
478cdf0e10cSrcweir 		case DEL_DELROWS:
479cdf0e10cSrcweir 			nPaint |= PAINT_LEFT;
480cdf0e10cSrcweir 			aWorkRange.aEnd.SetRow(MAXROW);
481cdf0e10cSrcweir 			break;
482cdf0e10cSrcweir 		case DEL_CELLSUP:
483cdf0e10cSrcweir             for( i=0; i<nCount; i++ )
484cdf0e10cSrcweir             {
485cdf0e10cSrcweir                 aWorkRange.aEnd.SetRow(MAXROW);
486cdf0e10cSrcweir                 if ( pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] ))
487cdf0e10cSrcweir                 {
488cdf0e10cSrcweir                     aWorkRange.aStart.SetCol(0);
489cdf0e10cSrcweir                     aWorkRange.aEnd.SetCol(MAXCOL);
490cdf0e10cSrcweir                     nPaint |= PAINT_LEFT;
491cdf0e10cSrcweir                 }
492cdf0e10cSrcweir             }
493cdf0e10cSrcweir             break;
494cdf0e10cSrcweir 		case DEL_DELCOLS:
495cdf0e10cSrcweir 			nPaint |= PAINT_TOP;				// obere Leiste
496cdf0e10cSrcweir 		case DEL_CELLSLEFT:
497cdf0e10cSrcweir             for( i=0; i<nCount; i++ )
498cdf0e10cSrcweir             {
499cdf0e10cSrcweir                 aWorkRange.aEnd.SetCol(MAXCOL);		// bis ganz nach rechts
500cdf0e10cSrcweir                 if ( pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] ) )
501cdf0e10cSrcweir                 {
502cdf0e10cSrcweir                     aWorkRange.aStart.SetCol(0);
503cdf0e10cSrcweir                     aWorkRange.aEnd.SetRow(MAXROW);
504cdf0e10cSrcweir                     nPaint |= PAINT_LEFT;
505cdf0e10cSrcweir                 }
506cdf0e10cSrcweir             }
507cdf0e10cSrcweir             break;
508cdf0e10cSrcweir         default:
509cdf0e10cSrcweir         {
510cdf0e10cSrcweir             // added to avoid warnings
511cdf0e10cSrcweir         }
512cdf0e10cSrcweir 	}
513cdf0e10cSrcweir 
514cdf0e10cSrcweir     for( i=0; i<nCount; i++ )
515cdf0e10cSrcweir     {
516cdf0e10cSrcweir         pDocShell->PostPaint( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i],
517cdf0e10cSrcweir             aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i]+pScenarios[i], nPaint, SC_PF_LINES );
518cdf0e10cSrcweir     }
519cdf0e10cSrcweir 	// Markierung erst nach EndUndo
520cdf0e10cSrcweir 
521cdf0e10cSrcweir 	pDocShell->PostDataChanged();
522cdf0e10cSrcweir 	//	CellContentChanged kommt mit der Markierung
523cdf0e10cSrcweir }
524cdf0e10cSrcweir 
Undo()525cdf0e10cSrcweir void __EXPORT ScUndoDeleteCells::Undo()
526cdf0e10cSrcweir {
527cdf0e10cSrcweir 	WaitObject aWait( pDocShell->GetActiveDialogParent() );		// wichtig wegen TrackFormulas bei UpdateReference
528cdf0e10cSrcweir 	BeginUndo();
529cdf0e10cSrcweir 	DoChange( sal_True );
530cdf0e10cSrcweir 	EndUndo();
531cdf0e10cSrcweir     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
532cdf0e10cSrcweir 
533cdf0e10cSrcweir 	// Markierung erst nach EndUndo
534cdf0e10cSrcweir     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
535cdf0e10cSrcweir     if (pViewShell)
536cdf0e10cSrcweir     {
537cdf0e10cSrcweir         for( SCTAB i=0; i<nCount; i++ )
538cdf0e10cSrcweir         {
539cdf0e10cSrcweir             pViewShell->MarkRange( ScRange(aEffRange.aStart.Col(), aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Col(), aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i]) );
540cdf0e10cSrcweir         }
541cdf0e10cSrcweir     }
542cdf0e10cSrcweir }
543cdf0e10cSrcweir 
Redo()544cdf0e10cSrcweir void __EXPORT ScUndoDeleteCells::Redo()
545cdf0e10cSrcweir {
546cdf0e10cSrcweir 	WaitObject aWait( pDocShell->GetActiveDialogParent() );		// wichtig wegen TrackFormulas bei UpdateReference
547cdf0e10cSrcweir 	BeginRedo();
548cdf0e10cSrcweir 	DoChange( sal_False);
549cdf0e10cSrcweir 	EndRedo();
550cdf0e10cSrcweir     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
551cdf0e10cSrcweir 
552cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
553cdf0e10cSrcweir 	if (pViewShell)
554cdf0e10cSrcweir 		pViewShell->DoneBlockMode();			// aktuelle weg
555cdf0e10cSrcweir }
556cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)557cdf0e10cSrcweir void __EXPORT ScUndoDeleteCells::Repeat(SfxRepeatTarget& rTarget)
558cdf0e10cSrcweir {
559cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
560cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->DeleteCells( eCmd, sal_True );
561cdf0e10cSrcweir }
562cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const563cdf0e10cSrcweir sal_Bool __EXPORT ScUndoDeleteCells::CanRepeat(SfxRepeatTarget& rTarget) const
564cdf0e10cSrcweir {
565cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
566cdf0e10cSrcweir }
567cdf0e10cSrcweir 
568cdf0e10cSrcweir 
569cdf0e10cSrcweir // -----------------------------------------------------------------------
570cdf0e10cSrcweir //
571cdf0e10cSrcweir //		Zellen loeschen auf Mehrfachselektion
572cdf0e10cSrcweir //
573cdf0e10cSrcweir 
ScUndoDeleteMulti(ScDocShell * pNewDocShell,sal_Bool bNewRows,sal_Bool bNeedsRefresh,SCTAB nNewTab,const SCCOLROW * pRng,SCCOLROW nRngCnt,ScDocument * pUndoDocument,ScRefUndoData * pRefData)574cdf0e10cSrcweir ScUndoDeleteMulti::ScUndoDeleteMulti( ScDocShell* pNewDocShell,
575cdf0e10cSrcweir                                         sal_Bool bNewRows, sal_Bool bNeedsRefresh, SCTAB nNewTab,
576cdf0e10cSrcweir 										const SCCOLROW* pRng, SCCOLROW nRngCnt,
577cdf0e10cSrcweir 										ScDocument* pUndoDocument, ScRefUndoData* pRefData ) :
578cdf0e10cSrcweir 	ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ),
579cdf0e10cSrcweir 	bRows( bNewRows ),
580cdf0e10cSrcweir     bRefresh( bNeedsRefresh ),
581cdf0e10cSrcweir 	nTab( nNewTab ),
582cdf0e10cSrcweir 	nRangeCnt( nRngCnt )
583cdf0e10cSrcweir {
584cdf0e10cSrcweir 	pRanges = new SCCOLROW[ 2 * nRangeCnt ];
585cdf0e10cSrcweir 	memcpy(pRanges,pRng,nRangeCnt*2*sizeof(SCCOLROW));
586cdf0e10cSrcweir 	SetChangeTrack();
587cdf0e10cSrcweir }
588cdf0e10cSrcweir 
~ScUndoDeleteMulti()589cdf0e10cSrcweir __EXPORT ScUndoDeleteMulti::~ScUndoDeleteMulti()
590cdf0e10cSrcweir {
591cdf0e10cSrcweir 	delete [] pRanges;
592cdf0e10cSrcweir }
593cdf0e10cSrcweir 
GetComment() const594cdf0e10cSrcweir String __EXPORT ScUndoDeleteMulti::GetComment() const
595cdf0e10cSrcweir {
596cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_DELETECELLS );	// wie DeleteCells
597cdf0e10cSrcweir }
598cdf0e10cSrcweir 
DoChange() const599cdf0e10cSrcweir void ScUndoDeleteMulti::DoChange() const
600cdf0e10cSrcweir {
601cdf0e10cSrcweir     SCCOL nStartCol;
602cdf0e10cSrcweir     SCROW nStartRow;
603cdf0e10cSrcweir     sal_uInt16 nPaint;
604cdf0e10cSrcweir     if (bRows)
605cdf0e10cSrcweir     {
606cdf0e10cSrcweir         nStartCol = 0;
607cdf0e10cSrcweir         nStartRow = static_cast<SCROW>(pRanges[0]);
608cdf0e10cSrcweir         nPaint = PAINT_GRID | PAINT_LEFT;
609cdf0e10cSrcweir     }
610cdf0e10cSrcweir     else
611cdf0e10cSrcweir     {
612cdf0e10cSrcweir         nStartCol = static_cast<SCCOL>(pRanges[0]);
613cdf0e10cSrcweir         nStartRow = 0;
614cdf0e10cSrcweir         nPaint = PAINT_GRID | PAINT_TOP;
615cdf0e10cSrcweir     }
616cdf0e10cSrcweir 
617cdf0e10cSrcweir     if ( bRefresh )
618cdf0e10cSrcweir     {
619cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
620cdf0e10cSrcweir         SCCOL nEndCol = MAXCOL;
621cdf0e10cSrcweir         SCROW nEndRow = MAXROW;
622cdf0e10cSrcweir         pDoc->RemoveFlagsTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, SC_MF_HOR | SC_MF_VER );
623cdf0e10cSrcweir         pDoc->ExtendMerge( nStartCol, nStartRow, nEndCol, nEndRow, nTab, sal_True );
624cdf0e10cSrcweir     }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir     pDocShell->PostPaint( nStartCol, nStartRow, nTab, MAXCOL, MAXROW, nTab, nPaint );
627cdf0e10cSrcweir 	pDocShell->PostDataChanged();
628cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
629cdf0e10cSrcweir 	if (pViewShell)
630cdf0e10cSrcweir 		pViewShell->CellContentChanged();
631cdf0e10cSrcweir 
632cdf0e10cSrcweir 	ShowTable( nTab );
633cdf0e10cSrcweir }
634cdf0e10cSrcweir 
SetChangeTrack()635cdf0e10cSrcweir void ScUndoDeleteMulti::SetChangeTrack()
636cdf0e10cSrcweir {
637cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
638cdf0e10cSrcweir 	if ( pChangeTrack )
639cdf0e10cSrcweir 	{
640cdf0e10cSrcweir 		nStartChangeAction = pChangeTrack->GetActionMax() + 1;
641cdf0e10cSrcweir 		ScRange aRange( 0, 0, nTab, 0, 0, nTab );
642cdf0e10cSrcweir 		if ( bRows )
643cdf0e10cSrcweir 			aRange.aEnd.SetCol( MAXCOL );
644cdf0e10cSrcweir 		else
645cdf0e10cSrcweir 			aRange.aEnd.SetRow( MAXROW );
646cdf0e10cSrcweir 		// rueckwaerts loeschen
647cdf0e10cSrcweir 		SCCOLROW* pOneRange = &pRanges[2*nRangeCnt];
648cdf0e10cSrcweir 		for ( SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++ )
649cdf0e10cSrcweir 		{
650cdf0e10cSrcweir 			SCCOLROW nEnd = *(--pOneRange);
651cdf0e10cSrcweir 			SCCOLROW nStart = *(--pOneRange);
652cdf0e10cSrcweir 			if ( bRows )
653cdf0e10cSrcweir 			{
654cdf0e10cSrcweir 				aRange.aStart.SetRow( nStart );
655cdf0e10cSrcweir 				aRange.aEnd.SetRow( nEnd );
656cdf0e10cSrcweir 			}
657cdf0e10cSrcweir 			else
658cdf0e10cSrcweir 			{
659cdf0e10cSrcweir 				aRange.aStart.SetCol( static_cast<SCCOL>(nStart) );
660cdf0e10cSrcweir 				aRange.aEnd.SetCol( static_cast<SCCOL>(nEnd) );
661cdf0e10cSrcweir 			}
662cdf0e10cSrcweir 			sal_uLong nDummyStart;
663cdf0e10cSrcweir 			pChangeTrack->AppendDeleteRange( aRange, pRefUndoDoc,
664cdf0e10cSrcweir 				nDummyStart, nEndChangeAction );
665cdf0e10cSrcweir 		}
666cdf0e10cSrcweir 	}
667cdf0e10cSrcweir 	else
668cdf0e10cSrcweir 		nStartChangeAction = nEndChangeAction = 0;
669cdf0e10cSrcweir }
670cdf0e10cSrcweir 
Undo()671cdf0e10cSrcweir void __EXPORT ScUndoDeleteMulti::Undo()
672cdf0e10cSrcweir {
673cdf0e10cSrcweir 	WaitObject aWait( pDocShell->GetActiveDialogParent() );		// wichtig wegen TrackFormulas bei UpdateReference
674cdf0e10cSrcweir 	BeginUndo();
675cdf0e10cSrcweir 
676cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
677cdf0e10cSrcweir 	SCCOLROW* pOneRange;
678cdf0e10cSrcweir 	SCCOLROW nRangeNo;
679cdf0e10cSrcweir 
680cdf0e10cSrcweir 	//	rueckwaerts geloescht -> vorwaerts einfuegen
681cdf0e10cSrcweir 	pOneRange = pRanges;
682cdf0e10cSrcweir 	for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
683cdf0e10cSrcweir 	{
684cdf0e10cSrcweir 		SCCOLROW nStart = *(pOneRange++);
685cdf0e10cSrcweir 		SCCOLROW nEnd = *(pOneRange++);
686cdf0e10cSrcweir 		if (bRows)
687cdf0e10cSrcweir 			pDoc->InsertRow( 0,nTab, MAXCOL,nTab, nStart,static_cast<SCSIZE>(nEnd-nStart+1) );
688cdf0e10cSrcweir 		else
689cdf0e10cSrcweir             pDoc->InsertCol( 0,nTab, MAXROW,nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd-nStart+1) );
690cdf0e10cSrcweir 	}
691cdf0e10cSrcweir 
692cdf0e10cSrcweir 	pOneRange = pRanges;
693cdf0e10cSrcweir 	for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
694cdf0e10cSrcweir 	{
695cdf0e10cSrcweir 		SCCOLROW nStart = *(pOneRange++);
696cdf0e10cSrcweir 		SCCOLROW nEnd = *(pOneRange++);
697cdf0e10cSrcweir 		if (bRows)
698cdf0e10cSrcweir 			pRefUndoDoc->CopyToDocument( 0,nStart,nTab, MAXCOL,nEnd,nTab, IDF_ALL,sal_False,pDoc );
699cdf0e10cSrcweir 		else
700cdf0e10cSrcweir             pRefUndoDoc->CopyToDocument( static_cast<SCCOL>(nStart),0,nTab,
701cdf0e10cSrcweir                     static_cast<SCCOL>(nEnd),MAXROW,nTab, IDF_ALL,sal_False,pDoc );
702cdf0e10cSrcweir 	}
703cdf0e10cSrcweir 
704cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
705cdf0e10cSrcweir 	if ( pChangeTrack )
706cdf0e10cSrcweir 		pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
707cdf0e10cSrcweir 
708cdf0e10cSrcweir 	DoChange();
709cdf0e10cSrcweir 
710cdf0e10cSrcweir 	//!	Markierung wieder einzeichnen
711cdf0e10cSrcweir 	//!	geht im Moment nicht, da keine Daten fuer Markierung vorhanden!
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 	EndUndo();
714cdf0e10cSrcweir     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
715cdf0e10cSrcweir }
716cdf0e10cSrcweir 
Redo()717cdf0e10cSrcweir void __EXPORT ScUndoDeleteMulti::Redo()
718cdf0e10cSrcweir {
719cdf0e10cSrcweir 	WaitObject aWait( pDocShell->GetActiveDialogParent() );		// wichtig wegen TrackFormulas bei UpdateReference
720cdf0e10cSrcweir 	BeginRedo();
721cdf0e10cSrcweir 
722cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
723cdf0e10cSrcweir 
724cdf0e10cSrcweir 	// rueckwaerts loeschen
725cdf0e10cSrcweir 	SCCOLROW* pOneRange = &pRanges[2*nRangeCnt];
726cdf0e10cSrcweir 	for (SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
727cdf0e10cSrcweir 	{
728cdf0e10cSrcweir 		SCCOLROW nEnd = *(--pOneRange);
729cdf0e10cSrcweir 		SCCOLROW nStart = *(--pOneRange);
730cdf0e10cSrcweir 		if (bRows)
731cdf0e10cSrcweir 			pDoc->DeleteRow( 0,nTab, MAXCOL,nTab, nStart,static_cast<SCSIZE>(nEnd-nStart+1) );
732cdf0e10cSrcweir 		else
733cdf0e10cSrcweir             pDoc->DeleteCol( 0,nTab, MAXROW,nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd-nStart+1) );
734cdf0e10cSrcweir 	}
735cdf0e10cSrcweir 
736cdf0e10cSrcweir 	SetChangeTrack();
737cdf0e10cSrcweir 
738cdf0e10cSrcweir 	DoChange();
739cdf0e10cSrcweir 
740cdf0e10cSrcweir //!	Markierung loeschen, derzeit unnoetig (s.o.)
741cdf0e10cSrcweir //!	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
742cdf0e10cSrcweir //!	if (pViewShell)
743cdf0e10cSrcweir //!		DoneBlockMode();
744cdf0e10cSrcweir 
745cdf0e10cSrcweir 	EndRedo();
746cdf0e10cSrcweir     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
747cdf0e10cSrcweir }
748cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)749cdf0e10cSrcweir void __EXPORT ScUndoDeleteMulti::Repeat(SfxRepeatTarget& rTarget)
750cdf0e10cSrcweir {
751cdf0e10cSrcweir 	//	DeleteCells, falls einfache Selektion
752cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
753cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->DeleteCells( DEL_DELROWS, sal_True );
754cdf0e10cSrcweir }
755cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const756cdf0e10cSrcweir sal_Bool __EXPORT ScUndoDeleteMulti::CanRepeat(SfxRepeatTarget& rTarget) const
757cdf0e10cSrcweir {
758cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
759cdf0e10cSrcweir }
760cdf0e10cSrcweir 
761cdf0e10cSrcweir 
762cdf0e10cSrcweir // -----------------------------------------------------------------------
763cdf0e10cSrcweir //
764cdf0e10cSrcweir //		Ausschneiden (Cut)
765cdf0e10cSrcweir //
766cdf0e10cSrcweir 
ScUndoCut(ScDocShell * pNewDocShell,ScRange aRange,ScAddress aOldEnd,const ScMarkData & rMark,ScDocument * pNewUndoDoc)767cdf0e10cSrcweir ScUndoCut::ScUndoCut( ScDocShell* pNewDocShell,
768cdf0e10cSrcweir 				ScRange aRange, ScAddress aOldEnd, const ScMarkData& rMark,
769cdf0e10cSrcweir 				ScDocument* pNewUndoDoc ) :
770cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, ScRange(aRange.aStart, aOldEnd), SC_UNDO_AUTOHEIGHT ),
771cdf0e10cSrcweir     aMarkData( rMark ),
772cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
773cdf0e10cSrcweir 	aExtendedRange( aRange )
774cdf0e10cSrcweir {
775cdf0e10cSrcweir 	SetChangeTrack();
776cdf0e10cSrcweir }
777cdf0e10cSrcweir 
~ScUndoCut()778cdf0e10cSrcweir __EXPORT ScUndoCut::~ScUndoCut()
779cdf0e10cSrcweir {
780cdf0e10cSrcweir 	delete pUndoDoc;
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
GetComment() const783cdf0e10cSrcweir String __EXPORT ScUndoCut::GetComment() const
784cdf0e10cSrcweir {
785cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_CUT ); // "Ausschneiden"
786cdf0e10cSrcweir }
787cdf0e10cSrcweir 
SetChangeTrack()788cdf0e10cSrcweir void ScUndoCut::SetChangeTrack()
789cdf0e10cSrcweir {
790cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
791cdf0e10cSrcweir 	if ( pChangeTrack )
792cdf0e10cSrcweir 		pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
793cdf0e10cSrcweir 			nStartChangeAction, nEndChangeAction, SC_CACM_CUT );
794cdf0e10cSrcweir 	else
795cdf0e10cSrcweir 		nStartChangeAction = nEndChangeAction = 0;
796cdf0e10cSrcweir }
797cdf0e10cSrcweir 
DoChange(const sal_Bool bUndo)798cdf0e10cSrcweir void ScUndoCut::DoChange( const sal_Bool bUndo )
799cdf0e10cSrcweir {
800cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
801cdf0e10cSrcweir 	sal_uInt16 nExtFlags = 0;
802cdf0e10cSrcweir 
803cdf0e10cSrcweir     // do not undo/redo objects and note captions, they are handled via drawing undo
804cdf0e10cSrcweir     sal_uInt16 nUndoFlags = (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS;
805cdf0e10cSrcweir 
806cdf0e10cSrcweir 	if (bUndo)	// nur bei Undo
807cdf0e10cSrcweir 	{
808cdf0e10cSrcweir         //  all sheets - CopyToDocument skips those that don't exist in pUndoDoc
809cdf0e10cSrcweir         SCTAB nTabCount = pDoc->GetTableCount();
810cdf0e10cSrcweir         ScRange aCopyRange = aExtendedRange;
811cdf0e10cSrcweir         aCopyRange.aStart.SetTab(0);
812cdf0e10cSrcweir         aCopyRange.aEnd.SetTab(nTabCount-1);
813cdf0e10cSrcweir         pUndoDoc->CopyToDocument( aCopyRange, nUndoFlags, sal_False, pDoc );
814cdf0e10cSrcweir 		ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
815cdf0e10cSrcweir 		if ( pChangeTrack )
816cdf0e10cSrcweir 			pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
817cdf0e10cSrcweir 	}
818cdf0e10cSrcweir 	else		// nur bei Redo
819cdf0e10cSrcweir 	{
820cdf0e10cSrcweir 		pDocShell->UpdatePaintExt( nExtFlags, aExtendedRange );
821cdf0e10cSrcweir         pDoc->DeleteArea( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(),
822cdf0e10cSrcweir                           aBlockRange.aEnd.Col(), aBlockRange.aEnd.Row(), aMarkData, nUndoFlags );
823cdf0e10cSrcweir 		SetChangeTrack();
824cdf0e10cSrcweir 	}
825cdf0e10cSrcweir 
826cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
827cdf0e10cSrcweir 	if ( !( (pViewShell) && pViewShell->AdjustBlockHeight() ) )
828cdf0e10cSrcweir /*A*/	pDocShell->PostPaint( aExtendedRange, PAINT_GRID, nExtFlags );
829cdf0e10cSrcweir 
830cdf0e10cSrcweir     if ( !bUndo )                               //   draw redo after updating row heights
831cdf0e10cSrcweir 		RedoSdrUndoAction( pDrawUndo );			//!	include in ScBlockUndo?
832cdf0e10cSrcweir 
833cdf0e10cSrcweir 	pDocShell->PostDataChanged();
834cdf0e10cSrcweir 	if (pViewShell)
835cdf0e10cSrcweir 		pViewShell->CellContentChanged();
836cdf0e10cSrcweir }
837cdf0e10cSrcweir 
Undo()838cdf0e10cSrcweir void __EXPORT ScUndoCut::Undo()
839cdf0e10cSrcweir {
840cdf0e10cSrcweir 	BeginUndo();
841cdf0e10cSrcweir 	DoChange( sal_True );
842cdf0e10cSrcweir 	EndUndo();
843cdf0e10cSrcweir }
844cdf0e10cSrcweir 
Redo()845cdf0e10cSrcweir void __EXPORT ScUndoCut::Redo()
846cdf0e10cSrcweir {
847cdf0e10cSrcweir 	BeginRedo();
848cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
849cdf0e10cSrcweir 	EnableDrawAdjust( pDoc, sal_False );				//! include in ScBlockUndo?
850cdf0e10cSrcweir 	DoChange( sal_False );
851cdf0e10cSrcweir 	EnableDrawAdjust( pDoc, sal_True );					//! include in ScBlockUndo?
852cdf0e10cSrcweir 	EndRedo();
853cdf0e10cSrcweir }
854cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)855cdf0e10cSrcweir void __EXPORT ScUndoCut::Repeat(SfxRepeatTarget& rTarget)
856cdf0e10cSrcweir {
857cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
858cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->CutToClip( NULL, sal_True );
859cdf0e10cSrcweir }
860cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const861cdf0e10cSrcweir sal_Bool __EXPORT ScUndoCut::CanRepeat(SfxRepeatTarget& rTarget) const
862cdf0e10cSrcweir {
863cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
864cdf0e10cSrcweir }
865cdf0e10cSrcweir 
866cdf0e10cSrcweir 
867cdf0e10cSrcweir // -----------------------------------------------------------------------
868cdf0e10cSrcweir //
869cdf0e10cSrcweir //		Einfuegen (Paste)
870cdf0e10cSrcweir //
871cdf0e10cSrcweir 
ScUndoPaste(ScDocShell * pNewDocShell,SCCOL nStartX,SCROW nStartY,SCTAB nStartZ,SCCOL nEndX,SCROW nEndY,SCTAB nEndZ,const ScMarkData & rMark,ScDocument * pNewUndoDoc,ScDocument * pNewRedoDoc,sal_uInt16 nNewFlags,ScRefUndoData * pRefData,void *,void *,void *,sal_Bool bRedoIsFilled,const ScUndoPasteOptions * pOptions)872cdf0e10cSrcweir ScUndoPaste::ScUndoPaste( ScDocShell* pNewDocShell,
873cdf0e10cSrcweir 				SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
874cdf0e10cSrcweir 				SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
875cdf0e10cSrcweir 				const ScMarkData& rMark,
876cdf0e10cSrcweir 				ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc,
877cdf0e10cSrcweir 				sal_uInt16 nNewFlags,
878cdf0e10cSrcweir 				ScRefUndoData* pRefData,
879cdf0e10cSrcweir                 void* /* pFill1 */, void* /* pFill2 */, void* /* pFill3 */,
880cdf0e10cSrcweir 				sal_Bool bRedoIsFilled, const ScUndoPasteOptions* pOptions ) :
881cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, ScRange( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ), SC_UNDO_SIMPLE ),
882cdf0e10cSrcweir 	aMarkData( rMark ),
883cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
884cdf0e10cSrcweir 	pRedoDoc( pNewRedoDoc ),
885cdf0e10cSrcweir 	nFlags( nNewFlags ),
886cdf0e10cSrcweir 	pRefUndoData( pRefData ),
887cdf0e10cSrcweir 	pRefRedoData( NULL ),
888cdf0e10cSrcweir 	bRedoFilled( bRedoIsFilled )
889cdf0e10cSrcweir {
890cdf0e10cSrcweir 	//	pFill1,pFill2,pFill3 are there so the ctor calls for simple paste (without cutting)
891cdf0e10cSrcweir 	//	don't have to be changed and branched for 641.
892cdf0e10cSrcweir 	//	They can be removed later.
893cdf0e10cSrcweir 
894cdf0e10cSrcweir 	if ( !aMarkData.IsMarked() )				// no cell marked:
895cdf0e10cSrcweir 		aMarkData.SetMarkArea( aBlockRange );	//  mark paste block
896cdf0e10cSrcweir 
897cdf0e10cSrcweir 	if ( pRefUndoData )
898cdf0e10cSrcweir 		pRefUndoData->DeleteUnchanged( pDocShell->GetDocument() );
899cdf0e10cSrcweir 
900cdf0e10cSrcweir 	if ( pOptions )
901cdf0e10cSrcweir 		aPasteOptions = *pOptions;		// used only for Repeat
902cdf0e10cSrcweir 
903cdf0e10cSrcweir 	SetChangeTrack();
904cdf0e10cSrcweir }
905cdf0e10cSrcweir 
~ScUndoPaste()906cdf0e10cSrcweir __EXPORT ScUndoPaste::~ScUndoPaste()
907cdf0e10cSrcweir {
908cdf0e10cSrcweir 	delete pUndoDoc;
909cdf0e10cSrcweir 	delete pRedoDoc;
910cdf0e10cSrcweir 	delete pRefUndoData;
911cdf0e10cSrcweir 	delete pRefRedoData;
912cdf0e10cSrcweir }
913cdf0e10cSrcweir 
GetComment() const914cdf0e10cSrcweir String __EXPORT ScUndoPaste::GetComment() const
915cdf0e10cSrcweir {
916cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_PASTE ); // "Einfuegen"
917cdf0e10cSrcweir }
918cdf0e10cSrcweir 
SetChangeTrack()919cdf0e10cSrcweir void ScUndoPaste::SetChangeTrack()
920cdf0e10cSrcweir {
921cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
922cdf0e10cSrcweir 	if ( pChangeTrack && (nFlags & IDF_CONTENTS) )
923cdf0e10cSrcweir 		pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
924cdf0e10cSrcweir 			nStartChangeAction, nEndChangeAction, SC_CACM_PASTE );
925cdf0e10cSrcweir 	else
926cdf0e10cSrcweir 		nStartChangeAction = nEndChangeAction = 0;
927cdf0e10cSrcweir }
928cdf0e10cSrcweir 
DoChange(const sal_Bool bUndo)929cdf0e10cSrcweir void ScUndoPaste::DoChange( const sal_Bool bUndo )
930cdf0e10cSrcweir {
931cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
932cdf0e10cSrcweir 
933cdf0e10cSrcweir 	//	RefUndoData for redo is created before first undo
934cdf0e10cSrcweir 	//	(with DeleteUnchanged after the DoUndo call)
935cdf0e10cSrcweir 	sal_Bool bCreateRedoData = ( bUndo && pRefUndoData && !pRefRedoData );
936cdf0e10cSrcweir 	if ( bCreateRedoData )
937cdf0e10cSrcweir 		pRefRedoData = new ScRefUndoData( pDoc );
938cdf0e10cSrcweir 
939cdf0e10cSrcweir 	ScRefUndoData* pWorkRefData = bUndo ? pRefUndoData : pRefRedoData;
940cdf0e10cSrcweir 
941cdf0e10cSrcweir 		//	fuer Undo immer alle oder keine Inhalte sichern
942cdf0e10cSrcweir 	sal_uInt16 nUndoFlags = IDF_NONE;
943cdf0e10cSrcweir 	if (nFlags & IDF_CONTENTS)
944cdf0e10cSrcweir 		nUndoFlags |= IDF_CONTENTS;
945cdf0e10cSrcweir 	if (nFlags & IDF_ATTRIB)
946cdf0e10cSrcweir 		nUndoFlags |= IDF_ATTRIB;
947cdf0e10cSrcweir 
948cdf0e10cSrcweir     // do not undo/redo objects and note captions, they are handled via drawing undo
949cdf0e10cSrcweir     (nUndoFlags &= ~IDF_OBJECTS) |= IDF_NOCAPTIONS;
950cdf0e10cSrcweir 
951cdf0e10cSrcweir 	sal_Bool bPaintAll = sal_False;
952cdf0e10cSrcweir 
953cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
954cdf0e10cSrcweir 
955cdf0e10cSrcweir 	// marking is in ScBlockUndo...
956cdf0e10cSrcweir 	ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockRange );
957cdf0e10cSrcweir 
958cdf0e10cSrcweir     SCTAB nTabCount = pDoc->GetTableCount();
959cdf0e10cSrcweir 	if ( bUndo && !bRedoFilled )
960cdf0e10cSrcweir 	{
961cdf0e10cSrcweir 		if (!pRedoDoc)
962cdf0e10cSrcweir 		{
963cdf0e10cSrcweir 			sal_Bool bColInfo = ( aBlockRange.aStart.Row()==0 && aBlockRange.aEnd.Row()==MAXROW );
964cdf0e10cSrcweir 			sal_Bool bRowInfo = ( aBlockRange.aStart.Col()==0 && aBlockRange.aEnd.Col()==MAXCOL );
965cdf0e10cSrcweir 
966cdf0e10cSrcweir 			pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
967cdf0e10cSrcweir             pRedoDoc->InitUndoSelected( pDoc, aMarkData, bColInfo, bRowInfo );
968cdf0e10cSrcweir 		}
969cdf0e10cSrcweir         //  read "redo" data from the document in the first undo
970cdf0e10cSrcweir 		//  all sheets - CopyToDocument skips those that don't exist in pRedoDoc
971cdf0e10cSrcweir         ScRange aCopyRange = aBlockRange;
972cdf0e10cSrcweir         aCopyRange.aStart.SetTab(0);
973cdf0e10cSrcweir         aCopyRange.aEnd.SetTab(nTabCount-1);
974cdf0e10cSrcweir 		pDoc->CopyToDocument( aCopyRange, nUndoFlags, sal_False, pRedoDoc );
975cdf0e10cSrcweir 		bRedoFilled = sal_True;
976cdf0e10cSrcweir 	}
977cdf0e10cSrcweir 
978cdf0e10cSrcweir 	sal_uInt16 nExtFlags = 0;
979cdf0e10cSrcweir 	pDocShell->UpdatePaintExt( nExtFlags, aBlockRange );
980cdf0e10cSrcweir 
981cdf0e10cSrcweir 	aMarkData.MarkToMulti();
982cdf0e10cSrcweir     pDoc->DeleteSelection( nUndoFlags, aMarkData );
983cdf0e10cSrcweir 	aMarkData.MarkToSimple();
984cdf0e10cSrcweir 
985cdf0e10cSrcweir     SCTAB nFirstSelected = aMarkData.GetFirstSelected();
986cdf0e10cSrcweir     ScRange aTabSelectRange = aBlockRange;
987cdf0e10cSrcweir     SCTAB nTab;
988cdf0e10cSrcweir 
989cdf0e10cSrcweir     if ( !bUndo && pRedoDoc )       // Redo: UndoToDocument before handling RefData
990cdf0e10cSrcweir     {
991cdf0e10cSrcweir         aTabSelectRange.aStart.SetTab( nFirstSelected );
992cdf0e10cSrcweir         aTabSelectRange.aEnd.SetTab( nFirstSelected );
993cdf0e10cSrcweir         pRedoDoc->UndoToDocument( aTabSelectRange, nUndoFlags, sal_False, pDoc );
994cdf0e10cSrcweir         for (nTab=0; nTab<nTabCount; nTab++)
995cdf0e10cSrcweir             if (nTab != nFirstSelected && aMarkData.GetTableSelect(nTab))
996cdf0e10cSrcweir             {
997cdf0e10cSrcweir                 aTabSelectRange.aStart.SetTab( nTab );
998cdf0e10cSrcweir                 aTabSelectRange.aEnd.SetTab( nTab );
999cdf0e10cSrcweir                 pRedoDoc->CopyToDocument( aTabSelectRange, nUndoFlags, sal_False, pDoc );
1000cdf0e10cSrcweir             }
1001cdf0e10cSrcweir     }
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir 	if (pWorkRefData)
1004cdf0e10cSrcweir 	{
1005cdf0e10cSrcweir 		pWorkRefData->DoUndo( pDoc, sal_True );		// sal_True = bSetChartRangeLists for SetChartListenerCollection
1006cdf0e10cSrcweir 		if ( pDoc->RefreshAutoFilter( 0,0, MAXCOL,MAXROW, aBlockRange.aStart.Tab() ) )
1007cdf0e10cSrcweir 			bPaintAll = sal_True;
1008cdf0e10cSrcweir 	}
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir 	if ( bCreateRedoData && pRefRedoData )
1011cdf0e10cSrcweir 		pRefRedoData->DeleteUnchanged( pDoc );
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir     if (bUndo)      // Undo: UndoToDocument after handling RefData
1014cdf0e10cSrcweir     {
1015cdf0e10cSrcweir         aTabSelectRange.aStart.SetTab( nFirstSelected );
1016cdf0e10cSrcweir         aTabSelectRange.aEnd.SetTab( nFirstSelected );
1017cdf0e10cSrcweir         pUndoDoc->UndoToDocument( aTabSelectRange, nUndoFlags, sal_False, pDoc );
1018cdf0e10cSrcweir         for (nTab=0; nTab<nTabCount; nTab++)
1019cdf0e10cSrcweir             if (nTab != nFirstSelected && aMarkData.GetTableSelect(nTab))
1020cdf0e10cSrcweir             {
1021cdf0e10cSrcweir                 aTabSelectRange.aStart.SetTab( nTab );
1022cdf0e10cSrcweir                 aTabSelectRange.aEnd.SetTab( nTab );
1023cdf0e10cSrcweir                 pUndoDoc->UndoToDocument( aTabSelectRange, nUndoFlags, sal_False, pDoc );
1024cdf0e10cSrcweir             }
1025cdf0e10cSrcweir     }
1026cdf0e10cSrcweir 
1027cdf0e10cSrcweir 	if ( bUndo )
1028cdf0e10cSrcweir 	{
1029cdf0e10cSrcweir 		ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1030cdf0e10cSrcweir 		if ( pChangeTrack )
1031cdf0e10cSrcweir 			pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1032cdf0e10cSrcweir 	}
1033cdf0e10cSrcweir 	else
1034cdf0e10cSrcweir 		SetChangeTrack();
1035cdf0e10cSrcweir 
1036cdf0e10cSrcweir 	ScRange aDrawRange( aBlockRange );
1037cdf0e10cSrcweir     pDoc->ExtendMerge( aDrawRange, sal_True );      // only needed for single sheet (text/rtf etc.)
1038cdf0e10cSrcweir 	sal_uInt16 nPaint = PAINT_GRID;
1039cdf0e10cSrcweir 	if (bPaintAll)
1040cdf0e10cSrcweir 	{
1041cdf0e10cSrcweir 		aDrawRange.aStart.SetCol(0);
1042cdf0e10cSrcweir 		aDrawRange.aStart.SetRow(0);
1043cdf0e10cSrcweir 		aDrawRange.aEnd.SetCol(MAXCOL);
1044cdf0e10cSrcweir 		aDrawRange.aEnd.SetRow(MAXROW);
1045cdf0e10cSrcweir 		nPaint |= PAINT_TOP | PAINT_LEFT;
1046cdf0e10cSrcweir /*A*/	if (pViewShell)
1047cdf0e10cSrcweir 			pViewShell->AdjustBlockHeight(sal_False);
1048cdf0e10cSrcweir 	}
1049cdf0e10cSrcweir 	else
1050cdf0e10cSrcweir 	{
1051cdf0e10cSrcweir 		if ( aBlockRange.aStart.Row() == 0 && aBlockRange.aEnd.Row() == MAXROW )	// ganze Spalte
1052cdf0e10cSrcweir 		{
1053cdf0e10cSrcweir 			nPaint |= PAINT_TOP;
1054cdf0e10cSrcweir 			aDrawRange.aEnd.SetCol(MAXCOL);
1055cdf0e10cSrcweir 		}
1056cdf0e10cSrcweir 		if ( aBlockRange.aStart.Col() == 0 && aBlockRange.aEnd.Col() == MAXCOL )	// ganze Zeile
1057cdf0e10cSrcweir 		{
1058cdf0e10cSrcweir 			nPaint |= PAINT_LEFT;
1059cdf0e10cSrcweir 			aDrawRange.aEnd.SetRow(MAXROW);
1060cdf0e10cSrcweir 		}
1061cdf0e10cSrcweir /*A*/	if ((pViewShell) && pViewShell->AdjustBlockHeight(sal_False))
1062cdf0e10cSrcweir 		{
1063cdf0e10cSrcweir 			aDrawRange.aStart.SetCol(0);
1064cdf0e10cSrcweir 			aDrawRange.aStart.SetRow(0);
1065cdf0e10cSrcweir 			aDrawRange.aEnd.SetCol(MAXCOL);
1066cdf0e10cSrcweir 			aDrawRange.aEnd.SetRow(MAXROW);
1067cdf0e10cSrcweir 			nPaint |= PAINT_LEFT;
1068cdf0e10cSrcweir 		}
1069cdf0e10cSrcweir 		pDocShell->UpdatePaintExt( nExtFlags, aDrawRange );
1070cdf0e10cSrcweir 	}
1071cdf0e10cSrcweir 
1072cdf0e10cSrcweir     if ( !bUndo )                               //   draw redo after updating row heights
1073cdf0e10cSrcweir 		RedoSdrUndoAction( pDrawUndo );			//!	include in ScBlockUndo?
1074cdf0e10cSrcweir 
1075cdf0e10cSrcweir 	pDocShell->PostPaint( aDrawRange, nPaint, nExtFlags );
1076cdf0e10cSrcweir 
1077cdf0e10cSrcweir 	pDocShell->PostDataChanged();
1078cdf0e10cSrcweir 	if (pViewShell)
1079cdf0e10cSrcweir 		pViewShell->CellContentChanged();
1080cdf0e10cSrcweir }
1081cdf0e10cSrcweir 
Undo()1082cdf0e10cSrcweir void __EXPORT ScUndoPaste::Undo()
1083cdf0e10cSrcweir {
1084cdf0e10cSrcweir 	BeginUndo();
1085cdf0e10cSrcweir 	DoChange( sal_True );
1086cdf0e10cSrcweir 	ShowTable( aBlockRange );
1087cdf0e10cSrcweir 	EndUndo();
1088cdf0e10cSrcweir     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1089cdf0e10cSrcweir }
1090cdf0e10cSrcweir 
Redo()1091cdf0e10cSrcweir void __EXPORT ScUndoPaste::Redo()
1092cdf0e10cSrcweir {
1093cdf0e10cSrcweir 	BeginRedo();
1094cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1095cdf0e10cSrcweir 	EnableDrawAdjust( pDoc, sal_False );				//! include in ScBlockUndo?
1096cdf0e10cSrcweir 	DoChange( sal_False );
1097cdf0e10cSrcweir 	EnableDrawAdjust( pDoc, sal_True );					//! include in ScBlockUndo?
1098cdf0e10cSrcweir 	EndRedo();
1099cdf0e10cSrcweir     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1100cdf0e10cSrcweir }
1101cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)1102cdf0e10cSrcweir void __EXPORT ScUndoPaste::Repeat(SfxRepeatTarget& rTarget)
1103cdf0e10cSrcweir {
1104cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1105cdf0e10cSrcweir 	{
1106cdf0e10cSrcweir 		ScTabViewShell* pViewSh = ((ScTabViewTarget&)rTarget).GetViewShell();
1107cdf0e10cSrcweir 		ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pViewSh->GetActiveWin() );
1108cdf0e10cSrcweir 		if (pOwnClip)
1109cdf0e10cSrcweir         {
1110cdf0e10cSrcweir             // #129384# keep a reference in case the clipboard is changed during PasteFromClip
1111cdf0e10cSrcweir             com::sun::star::uno::Reference<com::sun::star::datatransfer::XTransferable> aOwnClipRef( pOwnClip );
1112cdf0e10cSrcweir 			pViewSh->PasteFromClip( nFlags, pOwnClip->GetDocument(),
1113cdf0e10cSrcweir 									aPasteOptions.nFunction, aPasteOptions.bSkipEmpty, aPasteOptions.bTranspose,
1114cdf0e10cSrcweir 									aPasteOptions.bAsLink, aPasteOptions.eMoveMode, IDF_NONE,
1115cdf0e10cSrcweir 									sal_True );		// allow warning dialog
1116cdf0e10cSrcweir         }
1117cdf0e10cSrcweir 	}
1118cdf0e10cSrcweir }
1119cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const1120cdf0e10cSrcweir sal_Bool __EXPORT ScUndoPaste::CanRepeat(SfxRepeatTarget& rTarget) const
1121cdf0e10cSrcweir {
1122cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
1123cdf0e10cSrcweir }
1124cdf0e10cSrcweir 
1125cdf0e10cSrcweir 
1126cdf0e10cSrcweir // -----------------------------------------------------------------------
1127cdf0e10cSrcweir //
1128cdf0e10cSrcweir //		Verschieben/Kopieren (Drag & Drop)
1129cdf0e10cSrcweir //
1130cdf0e10cSrcweir 
ScUndoDragDrop(ScDocShell * pNewDocShell,const ScRange & rRange,ScAddress aNewDestPos,sal_Bool bNewCut,ScDocument * pUndoDocument,ScRefUndoData * pRefData,sal_Bool bScenario)1131cdf0e10cSrcweir ScUndoDragDrop::ScUndoDragDrop( ScDocShell* pNewDocShell,
1132cdf0e10cSrcweir 					const ScRange& rRange, ScAddress aNewDestPos, sal_Bool bNewCut,
1133cdf0e10cSrcweir 					ScDocument* pUndoDocument, ScRefUndoData* pRefData, sal_Bool bScenario ) :
1134cdf0e10cSrcweir 	ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFFIRST ),
1135cdf0e10cSrcweir 	aSrcRange( rRange ),
1136cdf0e10cSrcweir 	bCut( bNewCut ),
1137cdf0e10cSrcweir 	bKeepScenarioFlags( bScenario )
1138cdf0e10cSrcweir {
1139cdf0e10cSrcweir 	ScAddress aDestEnd(aNewDestPos);
1140cdf0e10cSrcweir 	aDestEnd.IncRow(aSrcRange.aEnd.Row() - aSrcRange.aStart.Row());
1141cdf0e10cSrcweir 	aDestEnd.IncCol(aSrcRange.aEnd.Col() - aSrcRange.aStart.Col());
1142cdf0e10cSrcweir 	aDestEnd.IncTab(aSrcRange.aEnd.Tab() - aSrcRange.aStart.Tab());
1143cdf0e10cSrcweir 
1144cdf0e10cSrcweir 	sal_Bool bIncludeFiltered = bCut;
1145cdf0e10cSrcweir 	if ( !bIncludeFiltered )
1146cdf0e10cSrcweir 	{
1147cdf0e10cSrcweir         // find number of non-filtered rows
1148cdf0e10cSrcweir         SCROW nPastedCount = pDocShell->GetDocument()->CountNonFilteredRows(
1149cdf0e10cSrcweir             aSrcRange.aStart.Row(), aSrcRange.aEnd.Row(), aSrcRange.aStart.Tab());
1150cdf0e10cSrcweir 
1151cdf0e10cSrcweir 		if ( nPastedCount == 0 )
1152cdf0e10cSrcweir 			nPastedCount = 1;
1153cdf0e10cSrcweir 		aDestEnd.SetRow( aNewDestPos.Row() + nPastedCount - 1 );
1154cdf0e10cSrcweir 	}
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir 	aDestRange.aStart = aNewDestPos;
1157cdf0e10cSrcweir 	aDestRange.aEnd = aDestEnd;
1158cdf0e10cSrcweir 
1159cdf0e10cSrcweir 	SetChangeTrack();
1160cdf0e10cSrcweir }
1161cdf0e10cSrcweir 
~ScUndoDragDrop()1162cdf0e10cSrcweir __EXPORT ScUndoDragDrop::~ScUndoDragDrop()
1163cdf0e10cSrcweir {
1164cdf0e10cSrcweir }
1165cdf0e10cSrcweir 
GetComment() const1166cdf0e10cSrcweir String __EXPORT ScUndoDragDrop::GetComment() const
1167cdf0e10cSrcweir {	// "Verschieben" : "Kopieren"
1168cdf0e10cSrcweir 	return bCut ?
1169cdf0e10cSrcweir 		ScGlobal::GetRscString( STR_UNDO_MOVE ) :
1170cdf0e10cSrcweir 		ScGlobal::GetRscString( STR_UNDO_COPY );
1171cdf0e10cSrcweir }
1172cdf0e10cSrcweir 
SetChangeTrack()1173cdf0e10cSrcweir void ScUndoDragDrop::SetChangeTrack()
1174cdf0e10cSrcweir {
1175cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
1176cdf0e10cSrcweir 	if ( pChangeTrack )
1177cdf0e10cSrcweir 	{
1178cdf0e10cSrcweir 		if ( bCut )
1179cdf0e10cSrcweir 		{
1180cdf0e10cSrcweir 			nStartChangeAction = pChangeTrack->GetActionMax() + 1;
1181cdf0e10cSrcweir 			pChangeTrack->AppendMove( aSrcRange, aDestRange, pRefUndoDoc );
1182cdf0e10cSrcweir 			nEndChangeAction = pChangeTrack->GetActionMax();
1183cdf0e10cSrcweir 		}
1184cdf0e10cSrcweir 		else
1185cdf0e10cSrcweir 			pChangeTrack->AppendContentRange( aDestRange, pRefUndoDoc,
1186cdf0e10cSrcweir 				nStartChangeAction, nEndChangeAction );
1187cdf0e10cSrcweir 	}
1188cdf0e10cSrcweir 	else
1189cdf0e10cSrcweir 		nStartChangeAction = nEndChangeAction = 0;
1190cdf0e10cSrcweir }
1191cdf0e10cSrcweir 
PaintArea(ScRange aRange,sal_uInt16 nExtFlags) const1192cdf0e10cSrcweir void ScUndoDragDrop::PaintArea( ScRange aRange, sal_uInt16 nExtFlags ) const
1193cdf0e10cSrcweir {
1194cdf0e10cSrcweir 	sal_uInt16 nPaint = PAINT_GRID;
1195cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1196cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1197cdf0e10cSrcweir 
1198cdf0e10cSrcweir 	if (pViewShell)
1199cdf0e10cSrcweir 	{
1200cdf0e10cSrcweir 		VirtualDevice aVirtDev;
1201cdf0e10cSrcweir 		ScViewData* pViewData = pViewShell->GetViewData();
1202cdf0e10cSrcweir 
1203cdf0e10cSrcweir 		if ( pDoc->SetOptimalHeight( aRange.aStart.Row(), aRange.aEnd.Row(),
1204cdf0e10cSrcweir 									 aRange.aStart.Tab(), 0, &aVirtDev,
1205cdf0e10cSrcweir 									 pViewData->GetPPTX(),  pViewData->GetPPTY(),
1206cdf0e10cSrcweir 									 pViewData->GetZoomX(), pViewData->GetZoomY(),
1207cdf0e10cSrcweir 									 sal_False ) )
1208cdf0e10cSrcweir 		{
1209cdf0e10cSrcweir 			aRange.aStart.SetCol(0);
1210cdf0e10cSrcweir 			aRange.aEnd.SetCol(MAXCOL);
1211cdf0e10cSrcweir 			aRange.aEnd.SetRow(MAXROW);
1212cdf0e10cSrcweir 			nPaint |= PAINT_LEFT;
1213cdf0e10cSrcweir 		}
1214cdf0e10cSrcweir 	}
1215cdf0e10cSrcweir 
1216cdf0e10cSrcweir 	if ( bKeepScenarioFlags )
1217cdf0e10cSrcweir 	{
1218cdf0e10cSrcweir 		//	Szenarien mitkopiert -> auch Szenario-Rahmen painten
1219cdf0e10cSrcweir 		aRange.aStart.SetCol(0);
1220cdf0e10cSrcweir 		aRange.aStart.SetRow(0);
1221cdf0e10cSrcweir 		aRange.aEnd.SetCol(MAXCOL);
1222cdf0e10cSrcweir 		aRange.aEnd.SetRow(MAXROW);
1223cdf0e10cSrcweir 	}
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir 	//	column/row info (width/height) included if whole columns/rows were copied
1226cdf0e10cSrcweir 	if ( aSrcRange.aStart.Col() == 0 && aSrcRange.aEnd.Col() == MAXCOL )
1227cdf0e10cSrcweir 	{
1228cdf0e10cSrcweir 		nPaint |= PAINT_LEFT;
1229cdf0e10cSrcweir 		aRange.aEnd.SetRow(MAXROW);
1230cdf0e10cSrcweir 	}
1231cdf0e10cSrcweir 	if ( aSrcRange.aStart.Row() == 0 && aSrcRange.aEnd.Row() == MAXROW )
1232cdf0e10cSrcweir 	{
1233cdf0e10cSrcweir 		nPaint |= PAINT_TOP;
1234cdf0e10cSrcweir 		aRange.aEnd.SetCol(MAXCOL);
1235cdf0e10cSrcweir 	}
1236cdf0e10cSrcweir 
1237cdf0e10cSrcweir 	pDocShell->PostPaint( aRange, nPaint, nExtFlags );
1238cdf0e10cSrcweir }
1239cdf0e10cSrcweir 
1240cdf0e10cSrcweir 
DoUndo(ScRange aRange) const1241cdf0e10cSrcweir void ScUndoDragDrop::DoUndo( ScRange aRange ) const
1242cdf0e10cSrcweir {
1243cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1244cdf0e10cSrcweir 
1245cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1246cdf0e10cSrcweir 	if ( pChangeTrack )
1247cdf0e10cSrcweir 		pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1248cdf0e10cSrcweir 
1249cdf0e10cSrcweir //?	DB-Areas vor Daten, damit bei ExtendMerge die Autofilter-Knoepfe stimmen
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir 	ScRange aPaintRange = aRange;
1252cdf0e10cSrcweir 	pDoc->ExtendMerge( aPaintRange );			// before deleting
1253cdf0e10cSrcweir 
1254cdf0e10cSrcweir 	sal_uInt16 nExtFlags = 0;
1255cdf0e10cSrcweir 	pDocShell->UpdatePaintExt( nExtFlags, aPaintRange );
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir     // do not undo objects and note captions, they are handled via drawing undo
1258cdf0e10cSrcweir     sal_uInt16 nUndoFlags = (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS;
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir     pDoc->DeleteAreaTab( aRange, nUndoFlags );
1261cdf0e10cSrcweir     pRefUndoDoc->CopyToDocument( aRange, nUndoFlags, sal_False, pDoc );
1262cdf0e10cSrcweir 	if ( pDoc->HasAttrib( aRange, HASATTR_MERGED ) )
1263cdf0e10cSrcweir 		pDoc->ExtendMerge( aRange, sal_True );
1264cdf0e10cSrcweir 
1265cdf0e10cSrcweir 	aPaintRange.aEnd.SetCol( Max( aPaintRange.aEnd.Col(), aRange.aEnd.Col() ) );
1266cdf0e10cSrcweir 	aPaintRange.aEnd.SetRow( Max( aPaintRange.aEnd.Row(), aRange.aEnd.Row() ) );
1267cdf0e10cSrcweir 
1268cdf0e10cSrcweir 	pDocShell->UpdatePaintExt( nExtFlags, aPaintRange );
1269cdf0e10cSrcweir 	PaintArea( aPaintRange, nExtFlags );
1270cdf0e10cSrcweir }
1271cdf0e10cSrcweir 
Undo()1272cdf0e10cSrcweir void __EXPORT ScUndoDragDrop::Undo()
1273cdf0e10cSrcweir {
1274cdf0e10cSrcweir 	BeginUndo();
1275cdf0e10cSrcweir 	DoUndo(aDestRange);
1276cdf0e10cSrcweir 	if (bCut)
1277cdf0e10cSrcweir 		DoUndo(aSrcRange);
1278cdf0e10cSrcweir 	EndUndo();
1279cdf0e10cSrcweir     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1280cdf0e10cSrcweir }
1281cdf0e10cSrcweir 
Redo()1282cdf0e10cSrcweir void __EXPORT ScUndoDragDrop::Redo()
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir 	BeginRedo();
1285cdf0e10cSrcweir 
1286cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1287cdf0e10cSrcweir 	ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP );
1288cdf0e10cSrcweir 
1289cdf0e10cSrcweir 	EnableDrawAdjust( pDoc, sal_False );				//! include in ScBlockUndo?
1290cdf0e10cSrcweir 
1291cdf0e10cSrcweir     // do not undo/redo objects and note captions, they are handled via drawing undo
1292cdf0e10cSrcweir     sal_uInt16 nRedoFlags = (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS;
1293cdf0e10cSrcweir 
1294cdf0e10cSrcweir     /*  TODO: Redoing note captions is quite tricky due to the fact that a
1295cdf0e10cSrcweir         helper clip document is used. While (re-)pasting the contents to the
1296cdf0e10cSrcweir         destination area, the original pointers to the captions created while
1297cdf0e10cSrcweir         dropping have to be restored. A simple CopyFromClip() would create new
1298cdf0e10cSrcweir         caption objects that are not tracked by drawing undo, and the captions
1299cdf0e10cSrcweir         restored by drawing redo would live without cell note objects pointing
1300cdf0e10cSrcweir         to them. So, first, CopyToClip() and CopyFromClip() are called without
1301cdf0e10cSrcweir         cloning the caption objects. This leads to cell notes pointing to the
1302cdf0e10cSrcweir         wrong captions from source area that will be removed by drawing redo
1303cdf0e10cSrcweir         later. Second, the pointers to the new captions have to be restored.
1304cdf0e10cSrcweir         Sadly, currently these pointers are not stored anywhere but in the list
1305cdf0e10cSrcweir         of drawing undo actions. */
1306cdf0e10cSrcweir 
1307cdf0e10cSrcweir 	SCTAB nTab;
1308cdf0e10cSrcweir 	ScMarkData aSourceMark;
1309cdf0e10cSrcweir 	for (nTab=aSrcRange.aStart.Tab(); nTab<=aSrcRange.aEnd.Tab(); nTab++)
1310cdf0e10cSrcweir 		aSourceMark.SelectTable( nTab, sal_True );
1311cdf0e10cSrcweir 
1312cdf0e10cSrcweir     // do not clone objects and note captions into clipdoc (see above)
1313cdf0e10cSrcweir     ScClipParam aClipParam(aSrcRange, bCut);
1314cdf0e10cSrcweir     pDoc->CopyToClip(aClipParam, pClipDoc, &aSourceMark, false, bKeepScenarioFlags, false, false);
1315cdf0e10cSrcweir 
1316cdf0e10cSrcweir 	if (bCut)
1317cdf0e10cSrcweir 	{
1318cdf0e10cSrcweir 		ScRange aSrcPaintRange = aSrcRange;
1319cdf0e10cSrcweir 		pDoc->ExtendMerge( aSrcPaintRange );			// before deleting
1320cdf0e10cSrcweir 		sal_uInt16 nExtFlags = 0;
1321cdf0e10cSrcweir 		pDocShell->UpdatePaintExt( nExtFlags, aSrcPaintRange );
1322cdf0e10cSrcweir         pDoc->DeleteAreaTab( aSrcRange, nRedoFlags );
1323cdf0e10cSrcweir 		PaintArea( aSrcPaintRange, nExtFlags );
1324cdf0e10cSrcweir 	}
1325cdf0e10cSrcweir 
1326cdf0e10cSrcweir 	ScMarkData aDestMark;
1327cdf0e10cSrcweir 	for (nTab=aDestRange.aStart.Tab(); nTab<=aDestRange.aEnd.Tab(); nTab++)
1328cdf0e10cSrcweir 		aDestMark.SelectTable( nTab, sal_True );
1329cdf0e10cSrcweir 
1330cdf0e10cSrcweir 	sal_Bool bIncludeFiltered = bCut;
1331cdf0e10cSrcweir     // TODO: restore old note captions instead of cloning new captions...
1332cdf0e10cSrcweir     pDoc->CopyFromClip( aDestRange, aDestMark, IDF_ALL & ~IDF_OBJECTS, NULL, pClipDoc, sal_True, sal_False, bIncludeFiltered );
1333cdf0e10cSrcweir 
1334cdf0e10cSrcweir     if (bCut)
1335cdf0e10cSrcweir         for (nTab=aSrcRange.aStart.Tab(); nTab<=aSrcRange.aEnd.Tab(); nTab++)
1336cdf0e10cSrcweir             pDoc->RefreshAutoFilter( aSrcRange.aStart.Col(), aSrcRange.aStart.Row(),
1337cdf0e10cSrcweir                                      aSrcRange.aEnd.Col(),   aSrcRange.aEnd.Row(), nTab );
1338cdf0e10cSrcweir 
1339cdf0e10cSrcweir 	// skipped rows and merged cells don't mix
1340cdf0e10cSrcweir 	if ( !bIncludeFiltered && pClipDoc->HasClipFilteredRows() )
1341cdf0e10cSrcweir 		pDocShell->GetDocFunc().UnmergeCells( aDestRange, sal_False, sal_True );
1342cdf0e10cSrcweir 
1343cdf0e10cSrcweir 	for (nTab=aDestRange.aStart.Tab(); nTab<=aDestRange.aEnd.Tab(); nTab++)
1344cdf0e10cSrcweir 	{
1345cdf0e10cSrcweir 		SCCOL nEndCol = aDestRange.aEnd.Col();
1346cdf0e10cSrcweir 		SCROW nEndRow = aDestRange.aEnd.Row();
1347cdf0e10cSrcweir 		pDoc->ExtendMerge( aDestRange.aStart.Col(), aDestRange.aStart.Row(),
1348cdf0e10cSrcweir 							nEndCol, nEndRow, nTab, sal_True );
1349cdf0e10cSrcweir 		PaintArea( ScRange( aDestRange.aStart.Col(), aDestRange.aStart.Row(), nTab,
1350cdf0e10cSrcweir 							nEndCol, nEndRow, nTab ), 0 );
1351cdf0e10cSrcweir 	}
1352cdf0e10cSrcweir 
1353cdf0e10cSrcweir 	SetChangeTrack();
1354cdf0e10cSrcweir 
1355cdf0e10cSrcweir 	delete pClipDoc;
1356cdf0e10cSrcweir 	ShowTable( aDestRange.aStart.Tab() );
1357cdf0e10cSrcweir 
1358cdf0e10cSrcweir     RedoSdrUndoAction( pDrawUndo );             //! include in ScBlockUndo?
1359cdf0e10cSrcweir 	EnableDrawAdjust( pDoc, sal_True );				//! include in ScBlockUndo?
1360cdf0e10cSrcweir 
1361cdf0e10cSrcweir 	EndRedo();
1362cdf0e10cSrcweir     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1363cdf0e10cSrcweir }
1364cdf0e10cSrcweir 
Repeat(SfxRepeatTarget &)1365cdf0e10cSrcweir void __EXPORT ScUndoDragDrop::Repeat(SfxRepeatTarget& /* rTarget */)
1366cdf0e10cSrcweir {
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget &) const1369cdf0e10cSrcweir sal_Bool __EXPORT ScUndoDragDrop::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1370cdf0e10cSrcweir {
1371cdf0e10cSrcweir 	return sal_False;			// geht nicht
1372cdf0e10cSrcweir }
1373cdf0e10cSrcweir 
1374cdf0e10cSrcweir 
1375cdf0e10cSrcweir // -----------------------------------------------------------------------
1376cdf0e10cSrcweir //
1377cdf0e10cSrcweir //		Liste der Bereichsnamen einfuegen
1378cdf0e10cSrcweir //		(Einfuegen|Name|Einfuegen =>[Liste])
1379cdf0e10cSrcweir //
1380cdf0e10cSrcweir 
ScUndoListNames(ScDocShell * pNewDocShell,const ScRange & rRange,ScDocument * pNewUndoDoc,ScDocument * pNewRedoDoc)1381cdf0e10cSrcweir ScUndoListNames::ScUndoListNames( ScDocShell* pNewDocShell, const ScRange& rRange,
1382cdf0e10cSrcweir 				ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc ) :
1383cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, rRange, SC_UNDO_AUTOHEIGHT ),
1384cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
1385cdf0e10cSrcweir 	pRedoDoc( pNewRedoDoc )
1386cdf0e10cSrcweir {
1387cdf0e10cSrcweir }
1388cdf0e10cSrcweir 
~ScUndoListNames()1389cdf0e10cSrcweir __EXPORT ScUndoListNames::~ScUndoListNames()
1390cdf0e10cSrcweir {
1391cdf0e10cSrcweir 	delete pUndoDoc;
1392cdf0e10cSrcweir 	delete pRedoDoc;
1393cdf0e10cSrcweir }
1394cdf0e10cSrcweir 
GetComment() const1395cdf0e10cSrcweir String __EXPORT ScUndoListNames::GetComment() const
1396cdf0e10cSrcweir {
1397cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_LISTNAMES );
1398cdf0e10cSrcweir }
1399cdf0e10cSrcweir 
DoChange(ScDocument * pSrcDoc) const1400cdf0e10cSrcweir void ScUndoListNames::DoChange( ScDocument* pSrcDoc ) const
1401cdf0e10cSrcweir {
1402cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1403cdf0e10cSrcweir 
1404cdf0e10cSrcweir 	pDoc->DeleteAreaTab( aBlockRange, IDF_ALL );
1405cdf0e10cSrcweir 	pSrcDoc->CopyToDocument( aBlockRange, IDF_ALL, sal_False, pDoc );
1406cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID );
1407cdf0e10cSrcweir 	pDocShell->PostDataChanged();
1408cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1409cdf0e10cSrcweir 	if (pViewShell)
1410cdf0e10cSrcweir 		pViewShell->CellContentChanged();
1411cdf0e10cSrcweir }
1412cdf0e10cSrcweir 
Undo()1413cdf0e10cSrcweir void __EXPORT ScUndoListNames::Undo()
1414cdf0e10cSrcweir {
1415cdf0e10cSrcweir 	BeginUndo();
1416cdf0e10cSrcweir 	DoChange(pUndoDoc);
1417cdf0e10cSrcweir 	EndUndo();
1418cdf0e10cSrcweir }
1419cdf0e10cSrcweir 
Redo()1420cdf0e10cSrcweir void __EXPORT ScUndoListNames::Redo()
1421cdf0e10cSrcweir {
1422cdf0e10cSrcweir 	BeginRedo();
1423cdf0e10cSrcweir 	DoChange(pRedoDoc);
1424cdf0e10cSrcweir 	EndRedo();
1425cdf0e10cSrcweir }
1426cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)1427cdf0e10cSrcweir void __EXPORT ScUndoListNames::Repeat(SfxRepeatTarget& rTarget)
1428cdf0e10cSrcweir {
1429cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1430cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->InsertNameList();
1431cdf0e10cSrcweir }
1432cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const1433cdf0e10cSrcweir sal_Bool __EXPORT ScUndoListNames::CanRepeat(SfxRepeatTarget& rTarget) const
1434cdf0e10cSrcweir {
1435cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
1436cdf0e10cSrcweir }
1437cdf0e10cSrcweir 
1438cdf0e10cSrcweir 
1439cdf0e10cSrcweir // -----------------------------------------------------------------------
1440cdf0e10cSrcweir //
1441cdf0e10cSrcweir //		Szenario anwenden
1442cdf0e10cSrcweir //		(Extras|Szenarien)
1443cdf0e10cSrcweir //
1444cdf0e10cSrcweir 
ScUndoUseScenario(ScDocShell * pNewDocShell,const ScMarkData & rMark,const ScArea & rDestArea,ScDocument * pNewUndoDoc,const String & rNewName)1445cdf0e10cSrcweir ScUndoUseScenario::ScUndoUseScenario( ScDocShell* pNewDocShell,
1446cdf0e10cSrcweir 						const ScMarkData& rMark,
1447cdf0e10cSrcweir /*C*/					const ScArea& rDestArea,
1448cdf0e10cSrcweir 							  ScDocument* pNewUndoDoc,
1449cdf0e10cSrcweir 						const String& rNewName ) :
1450cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
1451cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
1452cdf0e10cSrcweir 	aMarkData( rMark ),
1453cdf0e10cSrcweir 	aName( rNewName )
1454cdf0e10cSrcweir {
1455cdf0e10cSrcweir 	aRange.aStart.SetCol(rDestArea.nColStart);
1456cdf0e10cSrcweir 	aRange.aStart.SetRow(rDestArea.nRowStart);
1457cdf0e10cSrcweir 	aRange.aStart.SetTab(rDestArea.nTab);
1458cdf0e10cSrcweir 	aRange.aEnd.SetCol(rDestArea.nColEnd);
1459cdf0e10cSrcweir 	aRange.aEnd.SetRow(rDestArea.nRowEnd);
1460cdf0e10cSrcweir 	aRange.aEnd.SetTab(rDestArea.nTab);
1461cdf0e10cSrcweir }
1462cdf0e10cSrcweir 
~ScUndoUseScenario()1463cdf0e10cSrcweir __EXPORT ScUndoUseScenario::~ScUndoUseScenario()
1464cdf0e10cSrcweir {
1465cdf0e10cSrcweir 	delete pUndoDoc;
1466cdf0e10cSrcweir }
1467cdf0e10cSrcweir 
GetComment() const1468cdf0e10cSrcweir String __EXPORT ScUndoUseScenario::GetComment() const
1469cdf0e10cSrcweir {
1470cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_USESCENARIO );
1471cdf0e10cSrcweir }
1472cdf0e10cSrcweir 
Undo()1473cdf0e10cSrcweir void __EXPORT ScUndoUseScenario::Undo()
1474cdf0e10cSrcweir {
1475cdf0e10cSrcweir 	BeginUndo();
1476cdf0e10cSrcweir 
1477cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1478cdf0e10cSrcweir 	if (pViewShell)
1479cdf0e10cSrcweir 	{
1480cdf0e10cSrcweir 		pViewShell->DoneBlockMode();
1481cdf0e10cSrcweir 		pViewShell->InitOwnBlockMode();
1482cdf0e10cSrcweir 	}
1483cdf0e10cSrcweir 
1484cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1485cdf0e10cSrcweir 	pDoc->DeleteSelection( IDF_ALL, aMarkData );
1486cdf0e10cSrcweir 	pUndoDoc->CopyToDocument( aRange, IDF_ALL, sal_True, pDoc, &aMarkData );
1487cdf0e10cSrcweir 
1488cdf0e10cSrcweir 	//	Szenario-Tabellen
1489cdf0e10cSrcweir 	sal_Bool bFrame = sal_False;
1490cdf0e10cSrcweir 	SCTAB nTab = aRange.aStart.Tab();
1491cdf0e10cSrcweir 	SCTAB nEndTab = nTab;
1492cdf0e10cSrcweir 	while ( pUndoDoc->HasTable(nEndTab+1) && pUndoDoc->IsScenario(nEndTab+1) )
1493cdf0e10cSrcweir 		++nEndTab;
1494cdf0e10cSrcweir 	for (SCTAB i = nTab+1; i<=nEndTab; i++)
1495cdf0e10cSrcweir 	{
1496cdf0e10cSrcweir 		//	Flags immer
1497cdf0e10cSrcweir 		String aComment;
1498cdf0e10cSrcweir 		Color  aColor;
1499cdf0e10cSrcweir 		sal_uInt16 nScenFlags;
1500cdf0e10cSrcweir 		pUndoDoc->GetScenarioData( i, aComment, aColor, nScenFlags );
1501cdf0e10cSrcweir 		pDoc->SetScenarioData( i, aComment, aColor, nScenFlags );
1502cdf0e10cSrcweir 		sal_Bool bActive = pUndoDoc->IsActiveScenario( i );
1503cdf0e10cSrcweir 		pDoc->SetActiveScenario( i, bActive );
1504cdf0e10cSrcweir 		//	Bei Zurueckkopier-Szenarios auch Inhalte
1505cdf0e10cSrcweir 		if ( nScenFlags & SC_SCENARIO_TWOWAY )
1506cdf0e10cSrcweir 		{
1507cdf0e10cSrcweir 			pDoc->DeleteAreaTab( 0,0, MAXCOL,MAXROW, i, IDF_ALL );
1508cdf0e10cSrcweir 			pUndoDoc->CopyToDocument( 0,0,i, MAXCOL,MAXROW,i, IDF_ALL,sal_False, pDoc );
1509cdf0e10cSrcweir 		}
1510cdf0e10cSrcweir 		if ( nScenFlags & SC_SCENARIO_SHOWFRAME )
1511cdf0e10cSrcweir 			bFrame = sal_True;
1512cdf0e10cSrcweir 	}
1513cdf0e10cSrcweir 
1514cdf0e10cSrcweir 	//	Wenn sichtbare Rahmen, dann alles painten
1515cdf0e10cSrcweir 	if (bFrame)
1516cdf0e10cSrcweir 		pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_EXTRAS );
1517cdf0e10cSrcweir 	else
1518cdf0e10cSrcweir 		pDocShell->PostPaint( aRange, PAINT_GRID | PAINT_EXTRAS );
1519cdf0e10cSrcweir 	pDocShell->PostDataChanged();
1520cdf0e10cSrcweir 	if (pViewShell)
1521cdf0e10cSrcweir 		pViewShell->CellContentChanged();
1522cdf0e10cSrcweir 
1523cdf0e10cSrcweir 	ShowTable( aRange.aStart.Tab() );
1524cdf0e10cSrcweir 
1525cdf0e10cSrcweir 	EndUndo();
1526cdf0e10cSrcweir }
1527cdf0e10cSrcweir 
Redo()1528cdf0e10cSrcweir void __EXPORT ScUndoUseScenario::Redo()
1529cdf0e10cSrcweir {
1530cdf0e10cSrcweir 	SCTAB nTab = aRange.aStart.Tab();
1531cdf0e10cSrcweir 	BeginRedo();
1532cdf0e10cSrcweir 
1533cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1534cdf0e10cSrcweir 	if (pViewShell)
1535cdf0e10cSrcweir 	{
1536cdf0e10cSrcweir 		pViewShell->SetTabNo( nTab );
1537cdf0e10cSrcweir 		pViewShell->DoneBlockMode();
1538cdf0e10cSrcweir 		pViewShell->InitOwnBlockMode();
1539cdf0e10cSrcweir 	}
1540cdf0e10cSrcweir 
1541cdf0e10cSrcweir 	pDocShell->UseScenario( nTab, aName, sal_False );
1542cdf0e10cSrcweir 
1543cdf0e10cSrcweir 	EndRedo();
1544cdf0e10cSrcweir }
1545cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)1546cdf0e10cSrcweir void __EXPORT ScUndoUseScenario::Repeat(SfxRepeatTarget& rTarget)
1547cdf0e10cSrcweir {
1548cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1549cdf0e10cSrcweir 	{
1550cdf0e10cSrcweir 		String aTemp = aName;
1551cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->UseScenario(aTemp);
1552cdf0e10cSrcweir 	}
1553cdf0e10cSrcweir }
1554cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const1555cdf0e10cSrcweir sal_Bool __EXPORT ScUndoUseScenario::CanRepeat(SfxRepeatTarget& rTarget) const
1556cdf0e10cSrcweir {
1557cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1558cdf0e10cSrcweir 	{
1559cdf0e10cSrcweir 		ScViewData* pViewData = ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData();
1560cdf0e10cSrcweir 		return !pViewData->GetDocument()->IsScenario( pViewData->GetTabNo() );
1561cdf0e10cSrcweir 	}
1562cdf0e10cSrcweir 	return sal_False;
1563cdf0e10cSrcweir }
1564cdf0e10cSrcweir 
1565cdf0e10cSrcweir 
1566cdf0e10cSrcweir // -----------------------------------------------------------------------
1567cdf0e10cSrcweir //
1568cdf0e10cSrcweir //		Vorlage anwenden
1569cdf0e10cSrcweir //		(Format|Vorlagenkatalog)
1570cdf0e10cSrcweir //
1571cdf0e10cSrcweir 
ScUndoSelectionStyle(ScDocShell * pNewDocShell,const ScMarkData & rMark,const ScRange & rRange,const String & rName,ScDocument * pNewUndoDoc)1572cdf0e10cSrcweir ScUndoSelectionStyle::ScUndoSelectionStyle( ScDocShell* pNewDocShell,
1573cdf0e10cSrcweir 									  const ScMarkData& rMark,
1574cdf0e10cSrcweir 									  const ScRange& rRange,
1575cdf0e10cSrcweir 									  const String& rName,
1576cdf0e10cSrcweir 											ScDocument* pNewUndoDoc ) :
1577cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
1578cdf0e10cSrcweir 	aMarkData( rMark ),
1579cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
1580cdf0e10cSrcweir 	aStyleName( rName ),
1581cdf0e10cSrcweir 	aRange( rRange )
1582cdf0e10cSrcweir {
1583cdf0e10cSrcweir 	aMarkData.MarkToMulti();
1584cdf0e10cSrcweir }
1585cdf0e10cSrcweir 
~ScUndoSelectionStyle()1586cdf0e10cSrcweir __EXPORT ScUndoSelectionStyle::~ScUndoSelectionStyle()
1587cdf0e10cSrcweir {
1588cdf0e10cSrcweir 	delete pUndoDoc;
1589cdf0e10cSrcweir }
1590cdf0e10cSrcweir 
GetComment() const1591cdf0e10cSrcweir String __EXPORT ScUndoSelectionStyle::GetComment() const
1592cdf0e10cSrcweir {
1593cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_APPLYCELLSTYLE );
1594cdf0e10cSrcweir }
1595cdf0e10cSrcweir 
DoChange(const sal_Bool bUndo)1596cdf0e10cSrcweir void ScUndoSelectionStyle::DoChange( const sal_Bool bUndo )
1597cdf0e10cSrcweir {
1598cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1599cdf0e10cSrcweir 
1600cdf0e10cSrcweir     SetViewMarkData( aMarkData );
1601cdf0e10cSrcweir 
1602cdf0e10cSrcweir 	ScRange aWorkRange( aRange );
1603cdf0e10cSrcweir 	if ( pDoc->HasAttrib( aWorkRange, HASATTR_MERGED ) )		// zusammengefasste Zellen?
1604cdf0e10cSrcweir 		pDoc->ExtendMerge( aWorkRange, sal_True );
1605cdf0e10cSrcweir 
1606cdf0e10cSrcweir 	sal_uInt16 nExtFlags = 0;
1607cdf0e10cSrcweir 	pDocShell->UpdatePaintExt( nExtFlags, aWorkRange );
1608cdf0e10cSrcweir 
1609cdf0e10cSrcweir 	if (bUndo)		// bei Undo alte Daten wieder reinschubsen
1610cdf0e10cSrcweir 	{
1611cdf0e10cSrcweir 		SCTAB nTabCount = pDoc->GetTableCount();
1612cdf0e10cSrcweir 		ScRange aCopyRange = aWorkRange;
1613cdf0e10cSrcweir 		aCopyRange.aStart.SetTab(0);
1614cdf0e10cSrcweir 		aCopyRange.aEnd.SetTab(nTabCount-1);
1615cdf0e10cSrcweir 		pUndoDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_True, pDoc, &aMarkData );
1616cdf0e10cSrcweir 	}
1617cdf0e10cSrcweir 	else			// bei Redo Style wieder zuweisen
1618cdf0e10cSrcweir 	{
1619cdf0e10cSrcweir 		ScStyleSheetPool* pStlPool = pDoc->GetStyleSheetPool();
1620cdf0e10cSrcweir 		ScStyleSheet* pStyleSheet =
1621cdf0e10cSrcweir 			(ScStyleSheet*) pStlPool->Find( aStyleName, SFX_STYLE_FAMILY_PARA );
1622cdf0e10cSrcweir 		if (!pStyleSheet)
1623cdf0e10cSrcweir 		{
1624cdf0e10cSrcweir 			DBG_ERROR("StyleSheet not found");
1625cdf0e10cSrcweir 			return;
1626cdf0e10cSrcweir 		}
1627cdf0e10cSrcweir 		pDoc->ApplySelectionStyle( *pStyleSheet, aMarkData );
1628cdf0e10cSrcweir 	}
1629cdf0e10cSrcweir 
1630cdf0e10cSrcweir 	pDocShell->UpdatePaintExt( nExtFlags, aWorkRange );
1631cdf0e10cSrcweir 
1632cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1633cdf0e10cSrcweir 	if ( !( (pViewShell) && pViewShell->AdjustBlockHeight() ) )
1634cdf0e10cSrcweir /*A*/	pDocShell->PostPaint( aWorkRange, PAINT_GRID | PAINT_EXTRAS, nExtFlags );
1635cdf0e10cSrcweir 
1636cdf0e10cSrcweir 	ShowTable( aWorkRange.aStart.Tab() );
1637cdf0e10cSrcweir }
1638cdf0e10cSrcweir 
Undo()1639cdf0e10cSrcweir void __EXPORT ScUndoSelectionStyle::Undo()
1640cdf0e10cSrcweir {
1641cdf0e10cSrcweir 	BeginUndo();
1642cdf0e10cSrcweir 	DoChange( sal_True );
1643cdf0e10cSrcweir 	EndUndo();
1644cdf0e10cSrcweir }
1645cdf0e10cSrcweir 
Redo()1646cdf0e10cSrcweir void __EXPORT ScUndoSelectionStyle::Redo()
1647cdf0e10cSrcweir {
1648cdf0e10cSrcweir 	BeginRedo();
1649cdf0e10cSrcweir 	DoChange( sal_False );
1650cdf0e10cSrcweir 	EndRedo();
1651cdf0e10cSrcweir }
1652cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)1653cdf0e10cSrcweir void __EXPORT ScUndoSelectionStyle::Repeat(SfxRepeatTarget& rTarget)
1654cdf0e10cSrcweir {
1655cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1656cdf0e10cSrcweir 	{
1657cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
1658cdf0e10cSrcweir 		ScStyleSheetPool* pStlPool = pDoc->GetStyleSheetPool();
1659cdf0e10cSrcweir 		ScStyleSheet* pStyleSheet = (ScStyleSheet*) pStlPool->
1660cdf0e10cSrcweir 											Find( aStyleName, SFX_STYLE_FAMILY_PARA );
1661cdf0e10cSrcweir 		if (!pStyleSheet)
1662cdf0e10cSrcweir 		{
1663cdf0e10cSrcweir 			DBG_ERROR("StyleSheet not found");
1664cdf0e10cSrcweir 			return;
1665cdf0e10cSrcweir 		}
1666cdf0e10cSrcweir 
1667cdf0e10cSrcweir 		ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
1668cdf0e10cSrcweir 		rViewShell.SetStyleSheetToMarked( pStyleSheet, sal_True );
1669cdf0e10cSrcweir 	}
1670cdf0e10cSrcweir }
1671cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const1672cdf0e10cSrcweir sal_Bool __EXPORT ScUndoSelectionStyle::CanRepeat(SfxRepeatTarget& rTarget) const
1673cdf0e10cSrcweir {
1674cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
1675cdf0e10cSrcweir }
1676cdf0e10cSrcweir 
GetId() const1677cdf0e10cSrcweir sal_uInt16 __EXPORT ScUndoSelectionStyle::GetId() const
1678cdf0e10cSrcweir {
1679cdf0e10cSrcweir 	return STR_UNDO_APPLYCELLSTYLE;
1680cdf0e10cSrcweir }
1681cdf0e10cSrcweir 
1682cdf0e10cSrcweir 
1683cdf0e10cSrcweir // -----------------------------------------------------------------------
1684cdf0e10cSrcweir //
1685cdf0e10cSrcweir //		Matrix-Formel eingeben
1686cdf0e10cSrcweir //
1687cdf0e10cSrcweir 
ScUndoEnterMatrix(ScDocShell * pNewDocShell,const ScRange & rArea,ScDocument * pNewUndoDoc,const String & rForm)1688cdf0e10cSrcweir ScUndoEnterMatrix::ScUndoEnterMatrix( ScDocShell* pNewDocShell, const ScRange& rArea,
1689cdf0e10cSrcweir 									  ScDocument* pNewUndoDoc, const String& rForm ) :
1690cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, rArea, SC_UNDO_SIMPLE ),
1691cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
1692cdf0e10cSrcweir 	aFormula( rForm )
1693cdf0e10cSrcweir {
1694cdf0e10cSrcweir 	SetChangeTrack();
1695cdf0e10cSrcweir }
1696cdf0e10cSrcweir 
~ScUndoEnterMatrix()1697cdf0e10cSrcweir __EXPORT ScUndoEnterMatrix::~ScUndoEnterMatrix()
1698cdf0e10cSrcweir {
1699cdf0e10cSrcweir 	delete pUndoDoc;
1700cdf0e10cSrcweir }
1701cdf0e10cSrcweir 
GetComment() const1702cdf0e10cSrcweir String __EXPORT ScUndoEnterMatrix::GetComment() const
1703cdf0e10cSrcweir {
1704cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_ENTERMATRIX );
1705cdf0e10cSrcweir }
1706cdf0e10cSrcweir 
SetChangeTrack()1707cdf0e10cSrcweir void ScUndoEnterMatrix::SetChangeTrack()
1708cdf0e10cSrcweir {
1709cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1710cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1711cdf0e10cSrcweir 	if ( pChangeTrack )
1712cdf0e10cSrcweir 		pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
1713cdf0e10cSrcweir 			nStartChangeAction, nEndChangeAction );
1714cdf0e10cSrcweir 	else
1715cdf0e10cSrcweir 		nStartChangeAction = nEndChangeAction = 0;
1716cdf0e10cSrcweir }
1717cdf0e10cSrcweir 
Undo()1718cdf0e10cSrcweir void __EXPORT ScUndoEnterMatrix::Undo()
1719cdf0e10cSrcweir {
1720cdf0e10cSrcweir 	BeginUndo();
1721cdf0e10cSrcweir 
1722cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1723cdf0e10cSrcweir 
1724cdf0e10cSrcweir     pDoc->DeleteAreaTab( aBlockRange, IDF_ALL & ~IDF_NOTE );
1725cdf0e10cSrcweir     pUndoDoc->CopyToDocument( aBlockRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc );
1726cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID );
1727cdf0e10cSrcweir 	pDocShell->PostDataChanged();
1728cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1729cdf0e10cSrcweir 	if (pViewShell)
1730cdf0e10cSrcweir 		pViewShell->CellContentChanged();
1731cdf0e10cSrcweir 
1732cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1733cdf0e10cSrcweir 	if ( pChangeTrack )
1734cdf0e10cSrcweir 		pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1735cdf0e10cSrcweir 
1736cdf0e10cSrcweir 	EndUndo();
1737cdf0e10cSrcweir }
1738cdf0e10cSrcweir 
Redo()1739cdf0e10cSrcweir void __EXPORT ScUndoEnterMatrix::Redo()
1740cdf0e10cSrcweir {
1741cdf0e10cSrcweir 	BeginRedo();
1742cdf0e10cSrcweir 
1743cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1744cdf0e10cSrcweir 
1745cdf0e10cSrcweir 	ScMarkData aDestMark;
1746cdf0e10cSrcweir 	aDestMark.SelectOneTable( aBlockRange.aStart.Tab() );
1747cdf0e10cSrcweir 	aDestMark.SetMarkArea( aBlockRange );
1748cdf0e10cSrcweir 
1749cdf0e10cSrcweir 	pDoc->InsertMatrixFormula( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(),
1750cdf0e10cSrcweir 							   aBlockRange.aEnd.Col(),   aBlockRange.aEnd.Row(),
1751cdf0e10cSrcweir 							   aDestMark, aFormula );
1752cdf0e10cSrcweir //	pDocShell->PostPaint( aBlockRange, PAINT_GRID );	// nicht noetig ???
1753cdf0e10cSrcweir 
1754cdf0e10cSrcweir 	SetChangeTrack();
1755cdf0e10cSrcweir 
1756cdf0e10cSrcweir 	EndRedo();
1757cdf0e10cSrcweir }
1758cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)1759cdf0e10cSrcweir void __EXPORT ScUndoEnterMatrix::Repeat(SfxRepeatTarget& rTarget)
1760cdf0e10cSrcweir {
1761cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1762cdf0e10cSrcweir 	{
1763cdf0e10cSrcweir 		String aTemp = aFormula;
1764cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->EnterMatrix(aTemp);
1765cdf0e10cSrcweir 	}
1766cdf0e10cSrcweir }
1767cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const1768cdf0e10cSrcweir sal_Bool __EXPORT ScUndoEnterMatrix::CanRepeat(SfxRepeatTarget& rTarget) const
1769cdf0e10cSrcweir {
1770cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
1771cdf0e10cSrcweir }
1772cdf0e10cSrcweir 
1773cdf0e10cSrcweir // -----------------------------------------------------------------------
1774cdf0e10cSrcweir //
1775cdf0e10cSrcweir //		Einzug vermindern / erhoehen
1776cdf0e10cSrcweir //
1777cdf0e10cSrcweir 
lcl_GetMultiMarkRange(const ScMarkData & rMark)1778cdf0e10cSrcweir ScRange lcl_GetMultiMarkRange( const ScMarkData& rMark )
1779cdf0e10cSrcweir {
1780cdf0e10cSrcweir 	DBG_ASSERT( rMark.IsMultiMarked(), "wrong mark type" );
1781cdf0e10cSrcweir 
1782cdf0e10cSrcweir 	ScRange aRange;
1783cdf0e10cSrcweir 	rMark.GetMultiMarkArea( aRange );
1784cdf0e10cSrcweir 	return aRange;
1785cdf0e10cSrcweir }
1786cdf0e10cSrcweir 
ScUndoIndent(ScDocShell * pNewDocShell,const ScMarkData & rMark,ScDocument * pNewUndoDoc,sal_Bool bIncrement)1787cdf0e10cSrcweir ScUndoIndent::ScUndoIndent( ScDocShell* pNewDocShell, const ScMarkData& rMark,
1788cdf0e10cSrcweir 							ScDocument* pNewUndoDoc, sal_Bool bIncrement ) :
1789cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, lcl_GetMultiMarkRange(rMark), SC_UNDO_AUTOHEIGHT ),
1790cdf0e10cSrcweir 	aMarkData( rMark ),
1791cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
1792cdf0e10cSrcweir 	bIsIncrement( bIncrement )
1793cdf0e10cSrcweir {
1794cdf0e10cSrcweir }
1795cdf0e10cSrcweir 
~ScUndoIndent()1796cdf0e10cSrcweir __EXPORT ScUndoIndent::~ScUndoIndent()
1797cdf0e10cSrcweir {
1798cdf0e10cSrcweir 	delete pUndoDoc;
1799cdf0e10cSrcweir }
1800cdf0e10cSrcweir 
GetComment() const1801cdf0e10cSrcweir String __EXPORT ScUndoIndent::GetComment() const
1802cdf0e10cSrcweir {
1803cdf0e10cSrcweir 	sal_uInt16 nId = bIsIncrement ? STR_UNDO_INC_INDENT : STR_UNDO_DEC_INDENT;
1804cdf0e10cSrcweir 	return ScGlobal::GetRscString( nId );
1805cdf0e10cSrcweir }
1806cdf0e10cSrcweir 
Undo()1807cdf0e10cSrcweir void __EXPORT ScUndoIndent::Undo()
1808cdf0e10cSrcweir {
1809cdf0e10cSrcweir 	BeginUndo();
1810cdf0e10cSrcweir 
1811cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1812cdf0e10cSrcweir 	SCTAB nTabCount = pDoc->GetTableCount();
1813cdf0e10cSrcweir 	ScRange aCopyRange = aBlockRange;
1814cdf0e10cSrcweir 	aCopyRange.aStart.SetTab(0);
1815cdf0e10cSrcweir 	aCopyRange.aEnd.SetTab(nTabCount-1);
1816cdf0e10cSrcweir 	pUndoDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_True, pDoc, &aMarkData );
1817cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1818cdf0e10cSrcweir 
1819cdf0e10cSrcweir 	EndUndo();
1820cdf0e10cSrcweir }
1821cdf0e10cSrcweir 
Redo()1822cdf0e10cSrcweir void __EXPORT ScUndoIndent::Redo()
1823cdf0e10cSrcweir {
1824cdf0e10cSrcweir 	BeginRedo();
1825cdf0e10cSrcweir 
1826cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1827cdf0e10cSrcweir 	pDoc->ChangeSelectionIndent( bIsIncrement, aMarkData );
1828cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1829cdf0e10cSrcweir 
1830cdf0e10cSrcweir 	EndRedo();
1831cdf0e10cSrcweir }
1832cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)1833cdf0e10cSrcweir void __EXPORT ScUndoIndent::Repeat(SfxRepeatTarget& rTarget)
1834cdf0e10cSrcweir {
1835cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1836cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->ChangeIndent( bIsIncrement );
1837cdf0e10cSrcweir }
1838cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const1839cdf0e10cSrcweir sal_Bool __EXPORT ScUndoIndent::CanRepeat(SfxRepeatTarget& rTarget) const
1840cdf0e10cSrcweir {
1841cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
1842cdf0e10cSrcweir }
1843cdf0e10cSrcweir 
1844cdf0e10cSrcweir // -----------------------------------------------------------------------
1845cdf0e10cSrcweir //
1846cdf0e10cSrcweir //		Transliteration for cells
1847cdf0e10cSrcweir //
1848cdf0e10cSrcweir 
ScUndoTransliterate(ScDocShell * pNewDocShell,const ScMarkData & rMark,ScDocument * pNewUndoDoc,sal_Int32 nType)1849cdf0e10cSrcweir ScUndoTransliterate::ScUndoTransliterate( ScDocShell* pNewDocShell, const ScMarkData& rMark,
1850cdf0e10cSrcweir 							ScDocument* pNewUndoDoc, sal_Int32 nType ) :
1851cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, lcl_GetMultiMarkRange(rMark), SC_UNDO_AUTOHEIGHT ),
1852cdf0e10cSrcweir 	aMarkData( rMark ),
1853cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
1854cdf0e10cSrcweir 	nTransliterationType( nType )
1855cdf0e10cSrcweir {
1856cdf0e10cSrcweir }
1857cdf0e10cSrcweir 
~ScUndoTransliterate()1858cdf0e10cSrcweir __EXPORT ScUndoTransliterate::~ScUndoTransliterate()
1859cdf0e10cSrcweir {
1860cdf0e10cSrcweir 	delete pUndoDoc;
1861cdf0e10cSrcweir }
1862cdf0e10cSrcweir 
GetComment() const1863cdf0e10cSrcweir String __EXPORT ScUndoTransliterate::GetComment() const
1864cdf0e10cSrcweir {
1865cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_TRANSLITERATE );
1866cdf0e10cSrcweir }
1867cdf0e10cSrcweir 
Undo()1868cdf0e10cSrcweir void __EXPORT ScUndoTransliterate::Undo()
1869cdf0e10cSrcweir {
1870cdf0e10cSrcweir 	BeginUndo();
1871cdf0e10cSrcweir 
1872cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1873cdf0e10cSrcweir 	SCTAB nTabCount = pDoc->GetTableCount();
1874cdf0e10cSrcweir 	ScRange aCopyRange = aBlockRange;
1875cdf0e10cSrcweir 	aCopyRange.aStart.SetTab(0);
1876cdf0e10cSrcweir 	aCopyRange.aEnd.SetTab(nTabCount-1);
1877cdf0e10cSrcweir 	pUndoDoc->CopyToDocument( aCopyRange, IDF_CONTENTS, sal_True, pDoc, &aMarkData );
1878cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1879cdf0e10cSrcweir 
1880cdf0e10cSrcweir 	EndUndo();
1881cdf0e10cSrcweir }
1882cdf0e10cSrcweir 
Redo()1883cdf0e10cSrcweir void __EXPORT ScUndoTransliterate::Redo()
1884cdf0e10cSrcweir {
1885cdf0e10cSrcweir 	BeginRedo();
1886cdf0e10cSrcweir 
1887cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1888cdf0e10cSrcweir 	pDoc->TransliterateText( aMarkData, nTransliterationType );
1889cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1890cdf0e10cSrcweir 
1891cdf0e10cSrcweir 	EndRedo();
1892cdf0e10cSrcweir }
1893cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)1894cdf0e10cSrcweir void __EXPORT ScUndoTransliterate::Repeat(SfxRepeatTarget& rTarget)
1895cdf0e10cSrcweir {
1896cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1897cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->TransliterateText( nTransliterationType );
1898cdf0e10cSrcweir }
1899cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const1900cdf0e10cSrcweir sal_Bool __EXPORT ScUndoTransliterate::CanRepeat(SfxRepeatTarget& rTarget) const
1901cdf0e10cSrcweir {
1902cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
1903cdf0e10cSrcweir }
1904cdf0e10cSrcweir 
1905cdf0e10cSrcweir // -----------------------------------------------------------------------
1906cdf0e10cSrcweir //
1907cdf0e10cSrcweir //		einzelne Items per Which-IDs aus Bereich loeschen
1908cdf0e10cSrcweir //
1909cdf0e10cSrcweir 
ScUndoClearItems(ScDocShell * pNewDocShell,const ScMarkData & rMark,ScDocument * pNewUndoDoc,const sal_uInt16 * pW)1910cdf0e10cSrcweir ScUndoClearItems::ScUndoClearItems( ScDocShell* pNewDocShell, const ScMarkData& rMark,
1911cdf0e10cSrcweir 							ScDocument* pNewUndoDoc, const sal_uInt16* pW ) :
1912cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, lcl_GetMultiMarkRange(rMark), SC_UNDO_AUTOHEIGHT ),
1913cdf0e10cSrcweir 	aMarkData( rMark ),
1914cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc ),
1915cdf0e10cSrcweir 	pWhich( NULL )
1916cdf0e10cSrcweir {
1917cdf0e10cSrcweir 	DBG_ASSERT( pW, "ScUndoClearItems: Which-Pointer ist 0" );
1918cdf0e10cSrcweir 
1919cdf0e10cSrcweir 	sal_uInt16 nCount = 0;
1920cdf0e10cSrcweir 	while ( pW[nCount] )
1921cdf0e10cSrcweir 		++nCount;
1922cdf0e10cSrcweir 	pWhich = new sal_uInt16[nCount+1];
1923cdf0e10cSrcweir 	for (sal_uInt16 i=0; i<=nCount; i++)
1924cdf0e10cSrcweir 		pWhich[i] = pW[i];
1925cdf0e10cSrcweir }
1926cdf0e10cSrcweir 
~ScUndoClearItems()1927cdf0e10cSrcweir __EXPORT ScUndoClearItems::~ScUndoClearItems()
1928cdf0e10cSrcweir {
1929cdf0e10cSrcweir 	delete pUndoDoc;
1930cdf0e10cSrcweir 	delete pWhich;
1931cdf0e10cSrcweir }
1932cdf0e10cSrcweir 
GetComment() const1933cdf0e10cSrcweir String __EXPORT ScUndoClearItems::GetComment() const
1934cdf0e10cSrcweir {
1935cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_DELETECONTENTS );
1936cdf0e10cSrcweir }
1937cdf0e10cSrcweir 
Undo()1938cdf0e10cSrcweir void __EXPORT ScUndoClearItems::Undo()
1939cdf0e10cSrcweir {
1940cdf0e10cSrcweir 	BeginUndo();
1941cdf0e10cSrcweir 
1942cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1943cdf0e10cSrcweir 	pUndoDoc->CopyToDocument( aBlockRange, IDF_ATTRIB, sal_True, pDoc, &aMarkData );
1944cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1945cdf0e10cSrcweir 
1946cdf0e10cSrcweir 	EndUndo();
1947cdf0e10cSrcweir }
1948cdf0e10cSrcweir 
Redo()1949cdf0e10cSrcweir void __EXPORT ScUndoClearItems::Redo()
1950cdf0e10cSrcweir {
1951cdf0e10cSrcweir 	BeginRedo();
1952cdf0e10cSrcweir 
1953cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1954cdf0e10cSrcweir 	pDoc->ClearSelectionItems( pWhich, aMarkData );
1955cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1956cdf0e10cSrcweir 
1957cdf0e10cSrcweir 	EndRedo();
1958cdf0e10cSrcweir }
1959cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)1960cdf0e10cSrcweir void __EXPORT ScUndoClearItems::Repeat(SfxRepeatTarget& rTarget)
1961cdf0e10cSrcweir {
1962cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
1963cdf0e10cSrcweir 	{
1964cdf0e10cSrcweir 		ScViewData* pViewData = ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData();
1965cdf0e10cSrcweir 		ScDocFunc aFunc(*pViewData->GetDocShell());
1966cdf0e10cSrcweir 		aFunc.ClearItems( pViewData->GetMarkData(), pWhich, sal_False );
1967cdf0e10cSrcweir 	}
1968cdf0e10cSrcweir }
1969cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const1970cdf0e10cSrcweir sal_Bool __EXPORT ScUndoClearItems::CanRepeat(SfxRepeatTarget& rTarget) const
1971cdf0e10cSrcweir {
1972cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
1973cdf0e10cSrcweir }
1974cdf0e10cSrcweir 
1975cdf0e10cSrcweir // -----------------------------------------------------------------------
1976cdf0e10cSrcweir //
1977cdf0e10cSrcweir //		Alle Umbrueche einer Tabelle loeschen
1978cdf0e10cSrcweir //
1979cdf0e10cSrcweir 
ScUndoRemoveBreaks(ScDocShell * pNewDocShell,SCTAB nNewTab,ScDocument * pNewUndoDoc)1980cdf0e10cSrcweir ScUndoRemoveBreaks::ScUndoRemoveBreaks( ScDocShell* pNewDocShell,
1981cdf0e10cSrcweir 									SCTAB nNewTab, ScDocument* pNewUndoDoc ) :
1982cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
1983cdf0e10cSrcweir 	nTab( nNewTab ),
1984cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc )
1985cdf0e10cSrcweir {
1986cdf0e10cSrcweir }
1987cdf0e10cSrcweir 
~ScUndoRemoveBreaks()1988cdf0e10cSrcweir __EXPORT ScUndoRemoveBreaks::~ScUndoRemoveBreaks()
1989cdf0e10cSrcweir {
1990cdf0e10cSrcweir 	delete pUndoDoc;
1991cdf0e10cSrcweir }
1992cdf0e10cSrcweir 
GetComment() const1993cdf0e10cSrcweir String __EXPORT ScUndoRemoveBreaks::GetComment() const
1994cdf0e10cSrcweir {
1995cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_REMOVEBREAKS );
1996cdf0e10cSrcweir }
1997cdf0e10cSrcweir 
Undo()1998cdf0e10cSrcweir void __EXPORT ScUndoRemoveBreaks::Undo()
1999cdf0e10cSrcweir {
2000cdf0e10cSrcweir 	BeginUndo();
2001cdf0e10cSrcweir 
2002cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
2003cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2004cdf0e10cSrcweir 
2005cdf0e10cSrcweir 	pUndoDoc->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, sal_False, pDoc );
2006cdf0e10cSrcweir 	if (pViewShell)
2007cdf0e10cSrcweir 		pViewShell->UpdatePageBreakData( sal_True );
2008cdf0e10cSrcweir 	pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
2009cdf0e10cSrcweir 
2010cdf0e10cSrcweir 	EndUndo();
2011cdf0e10cSrcweir }
2012cdf0e10cSrcweir 
Redo()2013cdf0e10cSrcweir void __EXPORT ScUndoRemoveBreaks::Redo()
2014cdf0e10cSrcweir {
2015cdf0e10cSrcweir 	BeginRedo();
2016cdf0e10cSrcweir 
2017cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
2018cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2019cdf0e10cSrcweir 
2020cdf0e10cSrcweir 	pDoc->RemoveManualBreaks(nTab);
2021cdf0e10cSrcweir 	pDoc->UpdatePageBreaks(nTab);
2022cdf0e10cSrcweir 	if (pViewShell)
2023cdf0e10cSrcweir 		pViewShell->UpdatePageBreakData( sal_True );
2024cdf0e10cSrcweir 	pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
2025cdf0e10cSrcweir 
2026cdf0e10cSrcweir 	EndRedo();
2027cdf0e10cSrcweir }
2028cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)2029cdf0e10cSrcweir void __EXPORT ScUndoRemoveBreaks::Repeat(SfxRepeatTarget& rTarget)
2030cdf0e10cSrcweir {
2031cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
2032cdf0e10cSrcweir 	{
2033cdf0e10cSrcweir 		ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
2034cdf0e10cSrcweir 		rViewShell.RemoveManualBreaks();
2035cdf0e10cSrcweir 	}
2036cdf0e10cSrcweir }
2037cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const2038cdf0e10cSrcweir sal_Bool __EXPORT ScUndoRemoveBreaks::CanRepeat(SfxRepeatTarget& rTarget) const
2039cdf0e10cSrcweir {
2040cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
2041cdf0e10cSrcweir }
2042cdf0e10cSrcweir 
2043cdf0e10cSrcweir // -----------------------------------------------------------------------
2044cdf0e10cSrcweir //
2045cdf0e10cSrcweir //		Zusammenfassung aufheben (fuer einen ganzen Bereich)
2046cdf0e10cSrcweir //
2047cdf0e10cSrcweir 
ScUndoRemoveMerge(ScDocShell * pNewDocShell,const ScRange & rArea,ScDocument * pNewUndoDoc)2048cdf0e10cSrcweir ScUndoRemoveMerge::ScUndoRemoveMerge( ScDocShell* pNewDocShell,
2049cdf0e10cSrcweir 									   const ScRange& rArea, ScDocument* pNewUndoDoc ) :
2050cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, rArea, SC_UNDO_SIMPLE ),
2051cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc )
2052cdf0e10cSrcweir {
2053cdf0e10cSrcweir }
2054cdf0e10cSrcweir 
~ScUndoRemoveMerge()2055cdf0e10cSrcweir __EXPORT ScUndoRemoveMerge::~ScUndoRemoveMerge()
2056cdf0e10cSrcweir {
2057cdf0e10cSrcweir 	delete pUndoDoc;
2058cdf0e10cSrcweir }
2059cdf0e10cSrcweir 
GetComment() const2060cdf0e10cSrcweir String __EXPORT ScUndoRemoveMerge::GetComment() const
2061cdf0e10cSrcweir {
2062cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_REMERGE );	// "Zusammenfassung aufheben"
2063cdf0e10cSrcweir }
2064cdf0e10cSrcweir 
Undo()2065cdf0e10cSrcweir void __EXPORT ScUndoRemoveMerge::Undo()
2066cdf0e10cSrcweir {
2067cdf0e10cSrcweir 	BeginUndo();
2068cdf0e10cSrcweir 
2069cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
2070cdf0e10cSrcweir 
2071cdf0e10cSrcweir 	ScRange aExtended = aBlockRange;
2072cdf0e10cSrcweir 	pUndoDoc->ExtendMerge( aExtended );
2073cdf0e10cSrcweir 
2074cdf0e10cSrcweir 	pDoc->DeleteAreaTab( aExtended, IDF_ATTRIB );
2075cdf0e10cSrcweir 	pUndoDoc->CopyToDocument( aExtended, IDF_ATTRIB, sal_False, pDoc );
2076cdf0e10cSrcweir 
2077cdf0e10cSrcweir 	sal_Bool bDidPaint = sal_False;
2078cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2079cdf0e10cSrcweir 	if ( pViewShell )
2080cdf0e10cSrcweir 	{
2081cdf0e10cSrcweir 		pViewShell->SetTabNo( aExtended.aStart.Tab() );
2082cdf0e10cSrcweir 		bDidPaint = pViewShell->AdjustRowHeight( aExtended.aStart.Row(), aExtended.aEnd.Row() );
2083cdf0e10cSrcweir 	}
2084cdf0e10cSrcweir 	if (!bDidPaint)
2085cdf0e10cSrcweir 		ScUndoUtil::PaintMore( pDocShell, aExtended );
2086cdf0e10cSrcweir 
2087cdf0e10cSrcweir 	EndUndo();
2088cdf0e10cSrcweir }
2089cdf0e10cSrcweir 
Redo()2090cdf0e10cSrcweir void __EXPORT ScUndoRemoveMerge::Redo()
2091cdf0e10cSrcweir {
2092cdf0e10cSrcweir 	BeginRedo();
2093cdf0e10cSrcweir 
2094cdf0e10cSrcweir 	SCTAB nTab = aBlockRange.aStart.Tab();
2095cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
2096cdf0e10cSrcweir 	ScRange aExtended = aBlockRange;
2097cdf0e10cSrcweir 	pDoc->ExtendMerge( aExtended );
2098cdf0e10cSrcweir 	ScRange aRefresh = aExtended;
2099cdf0e10cSrcweir 	pDoc->ExtendOverlapped( aRefresh );
2100cdf0e10cSrcweir 
2101cdf0e10cSrcweir 	//	ausfuehren
2102cdf0e10cSrcweir 
2103cdf0e10cSrcweir 	const SfxPoolItem& rDefAttr = pDoc->GetPool()->GetDefaultItem( ATTR_MERGE );
2104cdf0e10cSrcweir 	ScPatternAttr aPattern( pDoc->GetPool() );
2105cdf0e10cSrcweir 	aPattern.GetItemSet().Put( rDefAttr );
2106cdf0e10cSrcweir 	pDoc->ApplyPatternAreaTab( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(),
2107cdf0e10cSrcweir 								aBlockRange.aEnd.Col(), aBlockRange.aEnd.Row(), nTab,
2108cdf0e10cSrcweir 								aPattern );
2109cdf0e10cSrcweir 
2110cdf0e10cSrcweir 	pDoc->RemoveFlagsTab( aExtended.aStart.Col(), aExtended.aStart.Row(),
2111cdf0e10cSrcweir 							aExtended.aEnd.Col(), aExtended.aEnd.Row(), nTab,
2112cdf0e10cSrcweir 							SC_MF_HOR | SC_MF_VER );
2113cdf0e10cSrcweir 
2114cdf0e10cSrcweir 	pDoc->ExtendMerge( aRefresh, sal_True, sal_False );
2115cdf0e10cSrcweir 
2116cdf0e10cSrcweir 	//	Paint
2117cdf0e10cSrcweir 
2118cdf0e10cSrcweir 	sal_Bool bDidPaint = sal_False;
2119cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2120cdf0e10cSrcweir 	if ( pViewShell )
2121cdf0e10cSrcweir 	{
2122cdf0e10cSrcweir 		pViewShell->SetTabNo( aExtended.aStart.Tab() );
2123cdf0e10cSrcweir 		bDidPaint = pViewShell->AdjustRowHeight( aExtended.aStart.Row(), aExtended.aEnd.Row() );
2124cdf0e10cSrcweir 	}
2125cdf0e10cSrcweir 	if (!bDidPaint)
2126cdf0e10cSrcweir 		ScUndoUtil::PaintMore( pDocShell, aExtended );
2127cdf0e10cSrcweir 
2128cdf0e10cSrcweir 	EndRedo();
2129cdf0e10cSrcweir }
2130cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)2131cdf0e10cSrcweir void __EXPORT ScUndoRemoveMerge::Repeat(SfxRepeatTarget& rTarget)
2132cdf0e10cSrcweir {
2133cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
2134cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->RemoveMerge();
2135cdf0e10cSrcweir }
2136cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const2137cdf0e10cSrcweir sal_Bool __EXPORT ScUndoRemoveMerge::CanRepeat(SfxRepeatTarget& rTarget) const
2138cdf0e10cSrcweir {
2139cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
2140cdf0e10cSrcweir }
2141cdf0e10cSrcweir 
2142cdf0e10cSrcweir // -----------------------------------------------------------------------
2143cdf0e10cSrcweir //
2144cdf0e10cSrcweir //		nur Umrandung setzen, per ScRangeList (StarOne)
2145cdf0e10cSrcweir //
2146cdf0e10cSrcweir 
lcl_TotalRange(const ScRangeList & rRanges)2147cdf0e10cSrcweir ScRange lcl_TotalRange( const ScRangeList& rRanges )
2148cdf0e10cSrcweir {
2149cdf0e10cSrcweir 	ScRange aTotal;
2150cdf0e10cSrcweir 	sal_uLong nCount = rRanges.Count();
2151cdf0e10cSrcweir 	for (sal_uLong i=0; i<nCount; i++)
2152cdf0e10cSrcweir 	{
2153cdf0e10cSrcweir 		ScRange aRange = *rRanges.GetObject(i);
2154cdf0e10cSrcweir 		if (i==0)
2155cdf0e10cSrcweir 			aTotal = aRange;
2156cdf0e10cSrcweir 		else
2157cdf0e10cSrcweir 		{
2158cdf0e10cSrcweir 			if (aRange.aStart.Col() < aTotal.aStart.Col())
2159cdf0e10cSrcweir 				aTotal.aStart.SetCol(aRange.aStart.Col());
2160cdf0e10cSrcweir 			if (aRange.aStart.Row() < aTotal.aStart.Row())
2161cdf0e10cSrcweir 				aTotal.aStart.SetRow(aRange.aStart.Row());
2162cdf0e10cSrcweir 			if (aRange.aStart.Tab() < aTotal.aStart.Tab())
2163cdf0e10cSrcweir 				aTotal.aStart.SetTab(aRange.aStart.Tab());
2164cdf0e10cSrcweir 			if (aRange.aEnd.Col() > aTotal.aEnd.Col())
2165cdf0e10cSrcweir 				aTotal.aEnd.SetCol(aRange.aEnd.Col());
2166cdf0e10cSrcweir 			if (aRange.aEnd.Row() > aTotal.aEnd.Row())
2167cdf0e10cSrcweir 				aTotal.aEnd.SetRow(aRange.aEnd.Row());
2168cdf0e10cSrcweir 			if (aRange.aEnd.Tab() > aTotal.aEnd.Tab())
2169cdf0e10cSrcweir 				aTotal.aEnd.SetTab(aRange.aEnd.Tab());
2170cdf0e10cSrcweir 		}
2171cdf0e10cSrcweir 	}
2172cdf0e10cSrcweir 	return aTotal;
2173cdf0e10cSrcweir }
2174cdf0e10cSrcweir 
ScUndoBorder(ScDocShell * pNewDocShell,const ScRangeList & rRangeList,ScDocument * pNewUndoDoc,const SvxBoxItem & rNewOuter,const SvxBoxInfoItem & rNewInner)2175cdf0e10cSrcweir ScUndoBorder::ScUndoBorder( ScDocShell* pNewDocShell,
2176cdf0e10cSrcweir 							const ScRangeList& rRangeList, ScDocument* pNewUndoDoc,
2177cdf0e10cSrcweir 							const SvxBoxItem& rNewOuter, const SvxBoxInfoItem& rNewInner ) :
2178cdf0e10cSrcweir 	ScBlockUndo( pNewDocShell, lcl_TotalRange(rRangeList), SC_UNDO_SIMPLE ),
2179cdf0e10cSrcweir 	pUndoDoc( pNewUndoDoc )
2180cdf0e10cSrcweir {
2181cdf0e10cSrcweir 	pRanges = new ScRangeList(rRangeList);
2182cdf0e10cSrcweir 	pOuter = new SvxBoxItem(rNewOuter);
2183cdf0e10cSrcweir 	pInner = new SvxBoxInfoItem(rNewInner);
2184cdf0e10cSrcweir }
2185cdf0e10cSrcweir 
~ScUndoBorder()2186cdf0e10cSrcweir __EXPORT ScUndoBorder::~ScUndoBorder()
2187cdf0e10cSrcweir {
2188cdf0e10cSrcweir 	delete pUndoDoc;
2189cdf0e10cSrcweir 	delete pRanges;
2190cdf0e10cSrcweir 	delete pOuter;
2191cdf0e10cSrcweir 	delete pInner;
2192cdf0e10cSrcweir }
2193cdf0e10cSrcweir 
GetComment() const2194cdf0e10cSrcweir String __EXPORT ScUndoBorder::GetComment() const
2195cdf0e10cSrcweir {
2196cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_SELATTRLINES );		//! eigener String?
2197cdf0e10cSrcweir }
2198cdf0e10cSrcweir 
Undo()2199cdf0e10cSrcweir void __EXPORT ScUndoBorder::Undo()
2200cdf0e10cSrcweir {
2201cdf0e10cSrcweir 	BeginUndo();
2202cdf0e10cSrcweir 
2203cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
2204cdf0e10cSrcweir 	ScMarkData aMarkData;
2205cdf0e10cSrcweir 	aMarkData.MarkFromRangeList( *pRanges, sal_False );
2206cdf0e10cSrcweir 	pUndoDoc->CopyToDocument( aBlockRange, IDF_ATTRIB, sal_True, pDoc, &aMarkData );
2207cdf0e10cSrcweir 	pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
2208cdf0e10cSrcweir 
2209cdf0e10cSrcweir 	EndUndo();
2210cdf0e10cSrcweir }
2211cdf0e10cSrcweir 
Redo()2212cdf0e10cSrcweir void __EXPORT ScUndoBorder::Redo()
2213cdf0e10cSrcweir {
2214cdf0e10cSrcweir 	BeginRedo();
2215cdf0e10cSrcweir 
2216cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();		//! Funktion an docfunc aufrufen
2217cdf0e10cSrcweir 	sal_uLong nCount = pRanges->Count();
2218cdf0e10cSrcweir 	sal_uLong i;
2219cdf0e10cSrcweir 	for (i=0; i<nCount; i++)
2220cdf0e10cSrcweir 	{
2221cdf0e10cSrcweir 		ScRange aRange = *pRanges->GetObject(i);
2222cdf0e10cSrcweir 		SCTAB nTab = aRange.aStart.Tab();
2223cdf0e10cSrcweir 
2224cdf0e10cSrcweir 		ScMarkData aMark;
2225cdf0e10cSrcweir 		aMark.SetMarkArea( aRange );
2226cdf0e10cSrcweir 		aMark.SelectTable( nTab, sal_True );
2227cdf0e10cSrcweir 
2228cdf0e10cSrcweir 		pDoc->ApplySelectionFrame( aMark, pOuter, pInner );
2229cdf0e10cSrcweir 	}
2230cdf0e10cSrcweir 	for (i=0; i<nCount; i++)
2231cdf0e10cSrcweir 		pDocShell->PostPaint( *pRanges->GetObject(i), PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
2232cdf0e10cSrcweir 
2233cdf0e10cSrcweir 	EndRedo();
2234cdf0e10cSrcweir }
2235cdf0e10cSrcweir 
Repeat(SfxRepeatTarget &)2236cdf0e10cSrcweir void __EXPORT ScUndoBorder::Repeat(SfxRepeatTarget& /* rTarget */)
2237cdf0e10cSrcweir {
2238cdf0e10cSrcweir 	//!	spaeter (wenn die Funktion aus cellsuno nach docfunc gewandert ist)
2239cdf0e10cSrcweir }
2240cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget &) const2241cdf0e10cSrcweir sal_Bool __EXPORT ScUndoBorder::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2242cdf0e10cSrcweir {
2243cdf0e10cSrcweir 	return sal_False;	// s.o.
2244cdf0e10cSrcweir }
2245cdf0e10cSrcweir 
2246cdf0e10cSrcweir 
2247cdf0e10cSrcweir 
2248cdf0e10cSrcweir 
2249