xref: /aoo41x/main/sc/source/ui/undo/undocell.cxx (revision b3f79822)
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
10*b3f79822SAndrew Rist  *
11*b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*b3f79822SAndrew Rist  *
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.
19*b3f79822SAndrew Rist  *
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 #include "scitems.hxx"
28cdf0e10cSrcweir #include <editeng/eeitem.hxx>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <editeng/editobj.hxx>
31cdf0e10cSrcweir #include <svl/zforlist.hxx>
32cdf0e10cSrcweir #include <sfx2/app.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include "undocell.hxx"
35cdf0e10cSrcweir #include "document.hxx"
36cdf0e10cSrcweir #include "docpool.hxx"
37cdf0e10cSrcweir #include "patattr.hxx"
38cdf0e10cSrcweir #include "docsh.hxx"
39cdf0e10cSrcweir #include "tabvwsh.hxx"
40cdf0e10cSrcweir #include "globstr.hrc"
41cdf0e10cSrcweir #include "global.hxx"
42cdf0e10cSrcweir #include "cell.hxx"
43cdf0e10cSrcweir #include "target.hxx"
44cdf0e10cSrcweir #include "undoolk.hxx"
45cdf0e10cSrcweir #include "detdata.hxx"
46cdf0e10cSrcweir #include "stlpool.hxx"
47cdf0e10cSrcweir #include "printfun.hxx"
48cdf0e10cSrcweir #include "rangenam.hxx"
49cdf0e10cSrcweir #include "chgtrack.hxx"
50cdf0e10cSrcweir #include "sc.hrc"
51cdf0e10cSrcweir #include "docuno.hxx"
52cdf0e10cSrcweir 
53cdf0e10cSrcweir // STATIC DATA -----------------------------------------------------------
54cdf0e10cSrcweir 
55cdf0e10cSrcweir TYPEINIT1(ScUndoCursorAttr, ScSimpleUndo);
56cdf0e10cSrcweir TYPEINIT1(ScUndoEnterData, ScSimpleUndo);
57cdf0e10cSrcweir TYPEINIT1(ScUndoEnterValue, ScSimpleUndo);
58cdf0e10cSrcweir TYPEINIT1(ScUndoPutCell, ScSimpleUndo);
59cdf0e10cSrcweir TYPEINIT1(ScUndoPageBreak, ScSimpleUndo);
60cdf0e10cSrcweir TYPEINIT1(ScUndoPrintZoom, ScSimpleUndo);
61cdf0e10cSrcweir TYPEINIT1(ScUndoThesaurus, ScSimpleUndo);
62cdf0e10cSrcweir TYPEINIT1(ScUndoReplaceNote, ScSimpleUndo);
63cdf0e10cSrcweir TYPEINIT1(ScUndoShowHideNote, ScSimpleUndo);
64cdf0e10cSrcweir TYPEINIT1(ScUndoDetective, ScSimpleUndo);
65cdf0e10cSrcweir TYPEINIT1(ScUndoRangeNames, ScSimpleUndo);
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 
68cdf0e10cSrcweir // -----------------------------------------------------------------------
69cdf0e10cSrcweir //
70cdf0e10cSrcweir //		Attribute auf Cursor anwenden
71cdf0e10cSrcweir //
72cdf0e10cSrcweir 
ScUndoCursorAttr(ScDocShell * pNewDocShell,SCCOL nNewCol,SCROW nNewRow,SCTAB nNewTab,const ScPatternAttr * pOldPat,const ScPatternAttr * pNewPat,const ScPatternAttr * pApplyPat,sal_Bool bAutomatic)73cdf0e10cSrcweir ScUndoCursorAttr::ScUndoCursorAttr( ScDocShell* pNewDocShell,
74cdf0e10cSrcweir 			SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab,
75cdf0e10cSrcweir 			const ScPatternAttr* pOldPat, const ScPatternAttr* pNewPat,
76cdf0e10cSrcweir 			const ScPatternAttr* pApplyPat, sal_Bool bAutomatic ) :
77cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
78cdf0e10cSrcweir 	nCol( nNewCol ),
79cdf0e10cSrcweir 	nRow( nNewRow ),
80cdf0e10cSrcweir 	nTab( nNewTab ),
81cdf0e10cSrcweir 	bIsAutomatic( bAutomatic )
82cdf0e10cSrcweir {
83cdf0e10cSrcweir 	ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool();
84cdf0e10cSrcweir 	pNewPattern = (ScPatternAttr*) &pPool->Put( *pNewPat );
85cdf0e10cSrcweir 	pOldPattern = (ScPatternAttr*) &pPool->Put( *pOldPat );
86cdf0e10cSrcweir 	pApplyPattern = (ScPatternAttr*) &pPool->Put( *pApplyPat );
87cdf0e10cSrcweir }
88cdf0e10cSrcweir 
~ScUndoCursorAttr()89cdf0e10cSrcweir __EXPORT ScUndoCursorAttr::~ScUndoCursorAttr()
90cdf0e10cSrcweir {
91cdf0e10cSrcweir 	ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool();
92cdf0e10cSrcweir 	pPool->Remove(*pNewPattern);
93cdf0e10cSrcweir 	pPool->Remove(*pOldPattern);
94cdf0e10cSrcweir 	pPool->Remove(*pApplyPattern);
95cdf0e10cSrcweir }
96cdf0e10cSrcweir 
GetComment() const97cdf0e10cSrcweir String __EXPORT ScUndoCursorAttr::GetComment() const
98cdf0e10cSrcweir {
99cdf0e10cSrcweir 	//!	eigener Text fuer automatische Attributierung
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 	sal_uInt16 nId = STR_UNDO_CURSORATTR;		 // "Attribute"
102cdf0e10cSrcweir 	return ScGlobal::GetRscString( nId );
103cdf0e10cSrcweir }
104cdf0e10cSrcweir 
DoChange(const ScPatternAttr * pWhichPattern) const105cdf0e10cSrcweir void ScUndoCursorAttr::DoChange( const ScPatternAttr* pWhichPattern ) const
106cdf0e10cSrcweir {
107cdf0e10cSrcweir 	pDocShell->GetDocument()->SetPattern( nCol, nRow, nTab, *pWhichPattern, sal_True );
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
110cdf0e10cSrcweir 	if (pViewShell)
111cdf0e10cSrcweir 	{
112cdf0e10cSrcweir 		pViewShell->SetTabNo( nTab );
113cdf0e10cSrcweir 		pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, sal_False, sal_False );
114cdf0e10cSrcweir 		pViewShell->AdjustBlockHeight();
115cdf0e10cSrcweir 	}
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	const SfxItemSet& rApplySet = pApplyPattern->GetItemSet();
118cdf0e10cSrcweir 	sal_Bool bPaintExt = ( rApplySet.GetItemState( ATTR_SHADOW, sal_True ) != SFX_ITEM_DEFAULT ||
119cdf0e10cSrcweir 					   rApplySet.GetItemState( ATTR_CONDITIONAL, sal_True ) != SFX_ITEM_DEFAULT );
120cdf0e10cSrcweir 	sal_Bool bPaintRows = ( rApplySet.GetItemState( ATTR_HOR_JUSTIFY, sal_True ) != SFX_ITEM_DEFAULT );
121cdf0e10cSrcweir 
122cdf0e10cSrcweir 	sal_uInt16 nFlags = SC_PF_TESTMERGE;
123cdf0e10cSrcweir 	if (bPaintExt)
124cdf0e10cSrcweir 		nFlags |= SC_PF_LINES;
125cdf0e10cSrcweir 	if (bPaintRows)
126cdf0e10cSrcweir 		nFlags |= SC_PF_WHOLEROWS;
127cdf0e10cSrcweir 	pDocShell->PostPaint( nCol,nRow,nTab, nCol,nRow,nTab, PAINT_GRID, nFlags );
128cdf0e10cSrcweir }
129cdf0e10cSrcweir 
Undo()130cdf0e10cSrcweir void __EXPORT ScUndoCursorAttr::Undo()
131cdf0e10cSrcweir {
132cdf0e10cSrcweir 	BeginUndo();
133cdf0e10cSrcweir 	DoChange(pOldPattern);
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 	if ( bIsAutomatic )
136cdf0e10cSrcweir 	{
137cdf0e10cSrcweir 		//	wenn automatische Formatierung rueckgaengig gemacht wird,
138cdf0e10cSrcweir 		//	soll auch nicht weiter automatisch formatiert werden:
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 		ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
141cdf0e10cSrcweir 		if (pViewShell)
142cdf0e10cSrcweir 			pViewShell->ForgetFormatArea();
143cdf0e10cSrcweir 	}
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 	EndUndo();
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
Redo()148cdf0e10cSrcweir void __EXPORT ScUndoCursorAttr::Redo()
149cdf0e10cSrcweir {
150cdf0e10cSrcweir 	BeginRedo();
151cdf0e10cSrcweir 	DoChange(pNewPattern);
152cdf0e10cSrcweir 	EndRedo();
153cdf0e10cSrcweir }
154cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)155cdf0e10cSrcweir void __EXPORT ScUndoCursorAttr::Repeat(SfxRepeatTarget& rTarget)
156cdf0e10cSrcweir {
157cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
158cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->ApplySelectionPattern( *pApplyPattern );
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const161cdf0e10cSrcweir sal_Bool __EXPORT ScUndoCursorAttr::CanRepeat(SfxRepeatTarget& rTarget) const
162cdf0e10cSrcweir {
163cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 
167cdf0e10cSrcweir // -----------------------------------------------------------------------
168cdf0e10cSrcweir //
169cdf0e10cSrcweir //		Daten eingeben
170cdf0e10cSrcweir //
171cdf0e10cSrcweir 
ScUndoEnterData(ScDocShell * pNewDocShell,SCCOL nNewCol,SCROW nNewRow,SCTAB nNewTab,SCTAB nNewCount,SCTAB * pNewTabs,ScBaseCell ** ppOldData,sal_Bool * pHasForm,sal_uLong * pOldForm,const String & rNewStr,EditTextObject * pObj)172cdf0e10cSrcweir ScUndoEnterData::ScUndoEnterData( ScDocShell* pNewDocShell,
173cdf0e10cSrcweir 			SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab,
174cdf0e10cSrcweir 			SCTAB nNewCount, SCTAB* pNewTabs, ScBaseCell** ppOldData,
175cdf0e10cSrcweir 			sal_Bool* pHasForm, sal_uLong* pOldForm,
176cdf0e10cSrcweir 			const String& rNewStr, EditTextObject* pObj ) :
177cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
178cdf0e10cSrcweir 	aNewString( rNewStr ),
179cdf0e10cSrcweir 	pTabs( pNewTabs ),
180cdf0e10cSrcweir 	ppOldCells( ppOldData ),
181cdf0e10cSrcweir 	pHasFormat( pHasForm ),
182cdf0e10cSrcweir 	pOldFormats( pOldForm ),
183cdf0e10cSrcweir 	pNewEditData( pObj ),
184cdf0e10cSrcweir 	nCol( nNewCol ),
185cdf0e10cSrcweir 	nRow( nNewRow ),
186cdf0e10cSrcweir 	nTab( nNewTab ),
187cdf0e10cSrcweir 	nCount( nNewCount )
188cdf0e10cSrcweir {
189cdf0e10cSrcweir 	SetChangeTrack();
190cdf0e10cSrcweir }
191cdf0e10cSrcweir 
~ScUndoEnterData()192cdf0e10cSrcweir __EXPORT ScUndoEnterData::~ScUndoEnterData()
193cdf0e10cSrcweir {
194cdf0e10cSrcweir 	for (sal_uInt16 i=0; i<nCount; i++)
195cdf0e10cSrcweir 		if (ppOldCells[i])
196cdf0e10cSrcweir 			ppOldCells[i]->Delete();
197cdf0e10cSrcweir 	delete[] ppOldCells;
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 	delete[] pHasFormat;
200cdf0e10cSrcweir 	delete[] pOldFormats;
201cdf0e10cSrcweir 	delete[] pTabs;
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 	delete pNewEditData;
204cdf0e10cSrcweir }
205cdf0e10cSrcweir 
GetComment() const206cdf0e10cSrcweir String __EXPORT ScUndoEnterData::GetComment() const
207cdf0e10cSrcweir {
208cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_ENTERDATA ); // "Eingabe"
209cdf0e10cSrcweir }
210cdf0e10cSrcweir 
DoChange() const211cdf0e10cSrcweir void ScUndoEnterData::DoChange() const
212cdf0e10cSrcweir {
213cdf0e10cSrcweir 	//	Zeilenhoehe anpassen
214cdf0e10cSrcweir 	//!	nur wenn noetig (alte oder neue EditZelle, oder Attribute) ??
215cdf0e10cSrcweir 	for (sal_uInt16 i=0; i<nCount; i++)
216cdf0e10cSrcweir 		pDocShell->AdjustRowHeight( nRow, nRow, pTabs[i] );
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
219cdf0e10cSrcweir 	if (pViewShell)
220cdf0e10cSrcweir 	{
221cdf0e10cSrcweir 		pViewShell->SetTabNo( nTab );
222cdf0e10cSrcweir 		pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, sal_False, sal_False );
223cdf0e10cSrcweir 	}
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 	pDocShell->PostDataChanged();
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
SetChangeTrack()228cdf0e10cSrcweir void ScUndoEnterData::SetChangeTrack()
229cdf0e10cSrcweir {
230cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
231cdf0e10cSrcweir 	if ( pChangeTrack )
232cdf0e10cSrcweir 	{
233cdf0e10cSrcweir 		nEndChangeAction = pChangeTrack->GetActionMax() + 1;
234cdf0e10cSrcweir 		ScAddress aPos( nCol, nRow, nTab );
235cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nCount; i++)
236cdf0e10cSrcweir 		{
237cdf0e10cSrcweir 			aPos.SetTab( pTabs[i] );
238cdf0e10cSrcweir 			sal_uLong nFormat = 0;
239cdf0e10cSrcweir 			if ( pHasFormat && pOldFormats )
240cdf0e10cSrcweir 			{
241cdf0e10cSrcweir 				if ( pHasFormat[i] )
242cdf0e10cSrcweir 					nFormat = pOldFormats[i];
243cdf0e10cSrcweir 			}
244cdf0e10cSrcweir 			pChangeTrack->AppendContent( aPos, ppOldCells[i], nFormat );
245cdf0e10cSrcweir 		}
246cdf0e10cSrcweir 		if ( nEndChangeAction > pChangeTrack->GetActionMax() )
247cdf0e10cSrcweir 			nEndChangeAction = 0;		// nichts appended
248cdf0e10cSrcweir 	}
249cdf0e10cSrcweir 	else
250cdf0e10cSrcweir 		nEndChangeAction = 0;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
Undo()253cdf0e10cSrcweir void __EXPORT ScUndoEnterData::Undo()
254cdf0e10cSrcweir {
255cdf0e10cSrcweir 	BeginUndo();
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
258cdf0e10cSrcweir 	for (sal_uInt16 i=0; i<nCount; i++)
259cdf0e10cSrcweir 	{
260cdf0e10cSrcweir         ScBaseCell* pNewCell = ppOldCells[i] ? ppOldCells[i]->CloneWithoutNote( *pDoc, SC_CLONECELL_STARTLISTENING ) : 0;
261cdf0e10cSrcweir 		pDoc->PutCell( nCol, nRow, pTabs[i], pNewCell );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 		if (pHasFormat && pOldFormats)
264cdf0e10cSrcweir 		{
265cdf0e10cSrcweir 			if ( pHasFormat[i] )
266cdf0e10cSrcweir 				pDoc->ApplyAttr( nCol, nRow, pTabs[i],
267cdf0e10cSrcweir 									SfxUInt32Item( ATTR_VALUE_FORMAT, pOldFormats[i] ) );
268cdf0e10cSrcweir 			else
269cdf0e10cSrcweir 			{
270cdf0e10cSrcweir 				ScPatternAttr aPattern( *pDoc->GetPattern( nCol, nRow, pTabs[i] ) );
271cdf0e10cSrcweir 				aPattern.GetItemSet().ClearItem( ATTR_VALUE_FORMAT );
272cdf0e10cSrcweir 				pDoc->SetPattern( nCol, nRow, pTabs[i], aPattern, sal_True );
273cdf0e10cSrcweir 			}
274cdf0e10cSrcweir 		}
275cdf0e10cSrcweir 		pDocShell->PostPaintCell( nCol, nRow, pTabs[i] );
276cdf0e10cSrcweir 	}
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
279cdf0e10cSrcweir     if ( pChangeTrack && nEndChangeAction >= sal::static_int_cast<sal_uLong>(nCount) )
280cdf0e10cSrcweir 		pChangeTrack->Undo( nEndChangeAction - nCount + 1, nEndChangeAction );
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 	DoChange();
283cdf0e10cSrcweir 	EndUndo();
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     // #i97876# Spreadsheet data changes are not notified
286cdf0e10cSrcweir     ScModelObj* pModelObj = ScModelObj::getImplementation( pDocShell->GetModel() );
287cdf0e10cSrcweir     if ( pModelObj && pModelObj->HasChangesListeners() )
288cdf0e10cSrcweir     {
289cdf0e10cSrcweir         ScRangeList aChangeRanges;
290cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < nCount; ++i )
291cdf0e10cSrcweir         {
292cdf0e10cSrcweir             aChangeRanges.Append( ScRange( nCol, nRow, pTabs[i] ) );
293cdf0e10cSrcweir         }
294cdf0e10cSrcweir         pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
295cdf0e10cSrcweir     }
296cdf0e10cSrcweir }
297cdf0e10cSrcweir 
Redo()298cdf0e10cSrcweir void __EXPORT ScUndoEnterData::Redo()
299cdf0e10cSrcweir {
300cdf0e10cSrcweir 	BeginRedo();
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
303cdf0e10cSrcweir 	for (sal_uInt16 i=0; i<nCount; i++)
304cdf0e10cSrcweir 	{
305cdf0e10cSrcweir 		if (pNewEditData)
306cdf0e10cSrcweir 			pDoc->PutCell( nCol, nRow, pTabs[i], new ScEditCell( pNewEditData,
307cdf0e10cSrcweir 				pDoc, NULL ) );
308cdf0e10cSrcweir 		else
309cdf0e10cSrcweir 			pDoc->SetString( nCol, nRow, pTabs[i], aNewString );
310cdf0e10cSrcweir 		pDocShell->PostPaintCell( nCol, nRow, pTabs[i] );
311cdf0e10cSrcweir 	}
312cdf0e10cSrcweir 
313cdf0e10cSrcweir 	SetChangeTrack();
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 	DoChange();
316cdf0e10cSrcweir 	EndRedo();
317cdf0e10cSrcweir 
318cdf0e10cSrcweir     // #i97876# Spreadsheet data changes are not notified
319cdf0e10cSrcweir     ScModelObj* pModelObj = ScModelObj::getImplementation( pDocShell->GetModel() );
320cdf0e10cSrcweir     if ( pModelObj && pModelObj->HasChangesListeners() )
321cdf0e10cSrcweir     {
322cdf0e10cSrcweir         ScRangeList aChangeRanges;
323cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < nCount; ++i )
324cdf0e10cSrcweir         {
325cdf0e10cSrcweir             aChangeRanges.Append( ScRange( nCol, nRow, pTabs[i] ) );
326cdf0e10cSrcweir         }
327cdf0e10cSrcweir         pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
328cdf0e10cSrcweir     }
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)331cdf0e10cSrcweir void __EXPORT ScUndoEnterData::Repeat(SfxRepeatTarget& rTarget)
332cdf0e10cSrcweir {
333cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
334cdf0e10cSrcweir 	{
335cdf0e10cSrcweir 		String aTemp = aNewString;
336cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->EnterDataAtCursor( aTemp );
337cdf0e10cSrcweir 	}
338cdf0e10cSrcweir }
339cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const340cdf0e10cSrcweir sal_Bool __EXPORT ScUndoEnterData::CanRepeat(SfxRepeatTarget& rTarget) const
341cdf0e10cSrcweir {
342cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 
346cdf0e10cSrcweir // -----------------------------------------------------------------------
347cdf0e10cSrcweir //
348cdf0e10cSrcweir //		Wert aendern
349cdf0e10cSrcweir //
350cdf0e10cSrcweir 
ScUndoEnterValue(ScDocShell * pNewDocShell,const ScAddress & rNewPos,ScBaseCell * pUndoCell,double nVal,sal_Bool bHeight)351cdf0e10cSrcweir ScUndoEnterValue::ScUndoEnterValue( ScDocShell* pNewDocShell, const ScAddress& rNewPos,
352cdf0e10cSrcweir 									ScBaseCell* pUndoCell, double nVal, sal_Bool bHeight ) :
353cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
354cdf0e10cSrcweir 	aPos		( rNewPos ),
355cdf0e10cSrcweir 	pOldCell	( pUndoCell ),
356cdf0e10cSrcweir 	nValue		( nVal ),
357cdf0e10cSrcweir 	bNeedHeight	( bHeight )
358cdf0e10cSrcweir {
359cdf0e10cSrcweir 	SetChangeTrack();
360cdf0e10cSrcweir }
361cdf0e10cSrcweir 
~ScUndoEnterValue()362cdf0e10cSrcweir __EXPORT ScUndoEnterValue::~ScUndoEnterValue()
363cdf0e10cSrcweir {
364cdf0e10cSrcweir 	if (pOldCell)
365cdf0e10cSrcweir 		pOldCell->Delete();
366cdf0e10cSrcweir }
367cdf0e10cSrcweir 
GetComment() const368cdf0e10cSrcweir String __EXPORT ScUndoEnterValue::GetComment() const
369cdf0e10cSrcweir {
370cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_ENTERDATA ); // "Eingabe"
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
SetChangeTrack()373cdf0e10cSrcweir void ScUndoEnterValue::SetChangeTrack()
374cdf0e10cSrcweir {
375cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
376cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
377cdf0e10cSrcweir 	if ( pChangeTrack )
378cdf0e10cSrcweir 	{
379cdf0e10cSrcweir 		nEndChangeAction = pChangeTrack->GetActionMax() + 1;
380cdf0e10cSrcweir 		pChangeTrack->AppendContent( aPos, pOldCell );
381cdf0e10cSrcweir 		if ( nEndChangeAction > pChangeTrack->GetActionMax() )
382cdf0e10cSrcweir 			nEndChangeAction = 0;		// nichts appended
383cdf0e10cSrcweir 	}
384cdf0e10cSrcweir 	else
385cdf0e10cSrcweir 		nEndChangeAction = 0;
386cdf0e10cSrcweir }
387cdf0e10cSrcweir 
Undo()388cdf0e10cSrcweir void __EXPORT ScUndoEnterValue::Undo()
389cdf0e10cSrcweir {
390cdf0e10cSrcweir 	BeginUndo();
391cdf0e10cSrcweir 
392cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
393cdf0e10cSrcweir     ScBaseCell* pNewCell = pOldCell ? pOldCell->CloneWithoutNote( *pDoc, SC_CLONECELL_STARTLISTENING ) : 0;
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 	pDoc->PutCell( aPos, pNewCell );
396cdf0e10cSrcweir 
397cdf0e10cSrcweir 	pDocShell->PostPaintCell( aPos );
398cdf0e10cSrcweir 
399cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
400cdf0e10cSrcweir 	if ( pChangeTrack )
401cdf0e10cSrcweir 		pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 	EndUndo();
404cdf0e10cSrcweir }
405cdf0e10cSrcweir 
Redo()406cdf0e10cSrcweir void __EXPORT ScUndoEnterValue::Redo()
407cdf0e10cSrcweir {
408cdf0e10cSrcweir 	BeginRedo();
409cdf0e10cSrcweir 
410cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
411cdf0e10cSrcweir 	pDoc->SetValue( aPos.Col(), aPos.Row(), aPos.Tab(), nValue );
412cdf0e10cSrcweir 	pDocShell->PostPaintCell( aPos );
413cdf0e10cSrcweir 
414cdf0e10cSrcweir 	SetChangeTrack();
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 	EndRedo();
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
Repeat(SfxRepeatTarget &)419cdf0e10cSrcweir void __EXPORT ScUndoEnterValue::Repeat(SfxRepeatTarget& /* rTarget */)
420cdf0e10cSrcweir {
421cdf0e10cSrcweir 	//	gippsnich
422cdf0e10cSrcweir }
423cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget &) const424cdf0e10cSrcweir sal_Bool __EXPORT ScUndoEnterValue::CanRepeat(SfxRepeatTarget& /* rTarget */) const
425cdf0e10cSrcweir {
426cdf0e10cSrcweir 	return sal_False;
427cdf0e10cSrcweir }
428cdf0e10cSrcweir 
429cdf0e10cSrcweir 
430cdf0e10cSrcweir // -----------------------------------------------------------------------
431cdf0e10cSrcweir //
432cdf0e10cSrcweir //		Beliebige Zelle eingeben
433cdf0e10cSrcweir //
434cdf0e10cSrcweir 
ScUndoPutCell(ScDocShell * pNewDocShell,const ScAddress & rNewPos,ScBaseCell * pUndoCell,ScBaseCell * pRedoCell,sal_Bool bHeight)435cdf0e10cSrcweir ScUndoPutCell::ScUndoPutCell( ScDocShell* pNewDocShell, const ScAddress& rNewPos,
436cdf0e10cSrcweir 							ScBaseCell* pUndoCell, ScBaseCell* pRedoCell, sal_Bool bHeight ) :
437cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
438cdf0e10cSrcweir 	aPos		( rNewPos ),
439cdf0e10cSrcweir 	pOldCell	( pUndoCell ),
440cdf0e10cSrcweir 	pEnteredCell( pRedoCell ),
441cdf0e10cSrcweir 	bNeedHeight	( bHeight )
442cdf0e10cSrcweir {
443cdf0e10cSrcweir 	SetChangeTrack();
444cdf0e10cSrcweir }
445cdf0e10cSrcweir 
~ScUndoPutCell()446cdf0e10cSrcweir __EXPORT ScUndoPutCell::~ScUndoPutCell()
447cdf0e10cSrcweir {
448cdf0e10cSrcweir 	if (pOldCell)
449cdf0e10cSrcweir 		pOldCell->Delete();
450cdf0e10cSrcweir 	if (pEnteredCell)
451cdf0e10cSrcweir 		pEnteredCell->Delete();
452cdf0e10cSrcweir }
453cdf0e10cSrcweir 
GetComment() const454cdf0e10cSrcweir String __EXPORT ScUndoPutCell::GetComment() const
455cdf0e10cSrcweir {
456cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_ENTERDATA ); // "Eingabe"
457cdf0e10cSrcweir }
458cdf0e10cSrcweir 
SetChangeTrack()459cdf0e10cSrcweir void ScUndoPutCell::SetChangeTrack()
460cdf0e10cSrcweir {
461cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
462cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
463cdf0e10cSrcweir 	if ( pChangeTrack )
464cdf0e10cSrcweir 	{
465cdf0e10cSrcweir 		nEndChangeAction = pChangeTrack->GetActionMax() + 1;
466cdf0e10cSrcweir 		pChangeTrack->AppendContent( aPos, pOldCell );
467cdf0e10cSrcweir 		if ( nEndChangeAction > pChangeTrack->GetActionMax() )
468cdf0e10cSrcweir 			nEndChangeAction = 0;		// nichts appended
469cdf0e10cSrcweir 	}
470cdf0e10cSrcweir 	else
471cdf0e10cSrcweir 		nEndChangeAction = 0;
472cdf0e10cSrcweir }
473cdf0e10cSrcweir 
Undo()474cdf0e10cSrcweir void __EXPORT ScUndoPutCell::Undo()
475cdf0e10cSrcweir {
476cdf0e10cSrcweir 	BeginUndo();
477cdf0e10cSrcweir 
478cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
479cdf0e10cSrcweir     ScBaseCell* pNewCell = pOldCell ? pOldCell->CloneWithoutNote( *pDoc, aPos, SC_CLONECELL_STARTLISTENING ) : 0;
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 	pDoc->PutCell( aPos.Col(), aPos.Row(), aPos.Tab(), pNewCell );
482cdf0e10cSrcweir 
483cdf0e10cSrcweir 	pDocShell->PostPaintCell( aPos );
484cdf0e10cSrcweir 
485cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
486cdf0e10cSrcweir 	if ( pChangeTrack )
487cdf0e10cSrcweir 		pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
488cdf0e10cSrcweir 
489cdf0e10cSrcweir 	EndUndo();
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
Redo()492cdf0e10cSrcweir void __EXPORT ScUndoPutCell::Redo()
493cdf0e10cSrcweir {
494cdf0e10cSrcweir 	BeginRedo();
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
497cdf0e10cSrcweir     ScBaseCell* pNewCell = pEnteredCell ? pEnteredCell->CloneWithoutNote( *pDoc, aPos, SC_CLONECELL_STARTLISTENING ) : 0;
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 	pDoc->PutCell( aPos.Col(), aPos.Row(), aPos.Tab(), pNewCell );
500cdf0e10cSrcweir 
501cdf0e10cSrcweir 	pDocShell->PostPaintCell( aPos );
502cdf0e10cSrcweir 
503cdf0e10cSrcweir 	SetChangeTrack();
504cdf0e10cSrcweir 
505cdf0e10cSrcweir 	EndRedo();
506cdf0e10cSrcweir }
507cdf0e10cSrcweir 
Repeat(SfxRepeatTarget &)508cdf0e10cSrcweir void __EXPORT ScUndoPutCell::Repeat(SfxRepeatTarget& /* rTarget */)
509cdf0e10cSrcweir {
510cdf0e10cSrcweir 	//	gippsnich
511cdf0e10cSrcweir }
512cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget &) const513cdf0e10cSrcweir sal_Bool __EXPORT ScUndoPutCell::CanRepeat(SfxRepeatTarget& /* rTarget */) const
514cdf0e10cSrcweir {
515cdf0e10cSrcweir 	return sal_False;
516cdf0e10cSrcweir }
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 
519cdf0e10cSrcweir // -----------------------------------------------------------------------
520cdf0e10cSrcweir //
521cdf0e10cSrcweir //		Seitenumbrueche
522cdf0e10cSrcweir //
523cdf0e10cSrcweir 
ScUndoPageBreak(ScDocShell * pNewDocShell,SCCOL nNewCol,SCROW nNewRow,SCTAB nNewTab,sal_Bool bNewColumn,sal_Bool bNewInsert)524cdf0e10cSrcweir ScUndoPageBreak::ScUndoPageBreak( ScDocShell* pNewDocShell,
525cdf0e10cSrcweir 			SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab,
526cdf0e10cSrcweir 			sal_Bool bNewColumn, sal_Bool bNewInsert ) :
527cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
528cdf0e10cSrcweir 	nCol( nNewCol ),
529cdf0e10cSrcweir 	nRow( nNewRow ),
530cdf0e10cSrcweir 	nTab( nNewTab ),
531cdf0e10cSrcweir 	bColumn( bNewColumn ),
532cdf0e10cSrcweir 	bInsert( bNewInsert )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir }
535cdf0e10cSrcweir 
~ScUndoPageBreak()536cdf0e10cSrcweir __EXPORT ScUndoPageBreak::~ScUndoPageBreak()
537cdf0e10cSrcweir {
538cdf0e10cSrcweir }
539cdf0e10cSrcweir 
GetComment() const540cdf0e10cSrcweir String __EXPORT ScUndoPageBreak::GetComment() const
541cdf0e10cSrcweir {
542cdf0e10cSrcweir 	//"Spaltenumbruch" | "Zeilenumbruch"  "einfuegen" | "loeschen"
543cdf0e10cSrcweir 	return String ( bColumn ?
544cdf0e10cSrcweir 		( bInsert ?
545cdf0e10cSrcweir 			ScGlobal::GetRscString( STR_UNDO_INSCOLBREAK ) :
546cdf0e10cSrcweir 			ScGlobal::GetRscString( STR_UNDO_DELCOLBREAK )
547cdf0e10cSrcweir 		) :
548cdf0e10cSrcweir 		( bInsert ?
549cdf0e10cSrcweir 			ScGlobal::GetRscString( STR_UNDO_INSROWBREAK ) :
550cdf0e10cSrcweir 			ScGlobal::GetRscString( STR_UNDO_DELROWBREAK )
551cdf0e10cSrcweir 		) );
552cdf0e10cSrcweir }
553cdf0e10cSrcweir 
DoChange(sal_Bool bInsertP) const554cdf0e10cSrcweir void ScUndoPageBreak::DoChange( sal_Bool bInsertP ) const
555cdf0e10cSrcweir {
556cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
557cdf0e10cSrcweir 
558cdf0e10cSrcweir 	if (pViewShell)
559cdf0e10cSrcweir 	{
560cdf0e10cSrcweir 		pViewShell->SetTabNo( nTab );
561cdf0e10cSrcweir 		pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, sal_False, sal_False );
562cdf0e10cSrcweir 
563cdf0e10cSrcweir         if (bInsertP)
564cdf0e10cSrcweir 			pViewShell->InsertPageBreak(bColumn, sal_False);
565cdf0e10cSrcweir 		else
566cdf0e10cSrcweir 			pViewShell->DeletePageBreak(bColumn, sal_False);
567cdf0e10cSrcweir 
568cdf0e10cSrcweir         pDocShell->GetDocument()->InvalidatePageBreaks(nTab);
569cdf0e10cSrcweir 	}
570cdf0e10cSrcweir }
571cdf0e10cSrcweir 
Undo()572cdf0e10cSrcweir void __EXPORT ScUndoPageBreak::Undo()
573cdf0e10cSrcweir {
574cdf0e10cSrcweir 	BeginUndo();
575cdf0e10cSrcweir 	DoChange(!bInsert);
576cdf0e10cSrcweir 	EndUndo();
577cdf0e10cSrcweir }
578cdf0e10cSrcweir 
Redo()579cdf0e10cSrcweir void __EXPORT ScUndoPageBreak::Redo()
580cdf0e10cSrcweir {
581cdf0e10cSrcweir 	BeginRedo();
582cdf0e10cSrcweir 	DoChange(bInsert);
583cdf0e10cSrcweir 	EndRedo();
584cdf0e10cSrcweir }
585cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)586cdf0e10cSrcweir void __EXPORT ScUndoPageBreak::Repeat(SfxRepeatTarget& rTarget)
587cdf0e10cSrcweir {
588cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
589cdf0e10cSrcweir 	{
590cdf0e10cSrcweir 		ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 		if (bInsert)
593cdf0e10cSrcweir 			rViewShell.InsertPageBreak(bColumn, sal_True);
594cdf0e10cSrcweir 		else
595cdf0e10cSrcweir 			rViewShell.DeletePageBreak(bColumn, sal_True);
596cdf0e10cSrcweir 	}
597cdf0e10cSrcweir }
598cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const599cdf0e10cSrcweir sal_Bool __EXPORT ScUndoPageBreak::CanRepeat(SfxRepeatTarget& rTarget) const
600cdf0e10cSrcweir {
601cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
602cdf0e10cSrcweir }
603cdf0e10cSrcweir 
604cdf0e10cSrcweir // -----------------------------------------------------------------------
605cdf0e10cSrcweir //
606cdf0e10cSrcweir //		Druck-Skalierung
607cdf0e10cSrcweir //
608cdf0e10cSrcweir 
ScUndoPrintZoom(ScDocShell * pNewDocShell,SCTAB nT,sal_uInt16 nOS,sal_uInt16 nOP,sal_uInt16 nNS,sal_uInt16 nNP)609cdf0e10cSrcweir ScUndoPrintZoom::ScUndoPrintZoom( ScDocShell* pNewDocShell,
610cdf0e10cSrcweir 			SCTAB nT, sal_uInt16 nOS, sal_uInt16 nOP, sal_uInt16 nNS, sal_uInt16 nNP ) :
611cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
612cdf0e10cSrcweir 	nTab( nT ),
613cdf0e10cSrcweir 	nOldScale( nOS ),
614cdf0e10cSrcweir 	nOldPages( nOP ),
615cdf0e10cSrcweir 	nNewScale( nNS ),
616cdf0e10cSrcweir 	nNewPages( nNP )
617cdf0e10cSrcweir {
618cdf0e10cSrcweir }
619cdf0e10cSrcweir 
~ScUndoPrintZoom()620cdf0e10cSrcweir __EXPORT ScUndoPrintZoom::~ScUndoPrintZoom()
621cdf0e10cSrcweir {
622cdf0e10cSrcweir }
623cdf0e10cSrcweir 
GetComment() const624cdf0e10cSrcweir String __EXPORT ScUndoPrintZoom::GetComment() const
625cdf0e10cSrcweir {
626cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_PRINTSCALE );
627cdf0e10cSrcweir }
628cdf0e10cSrcweir 
DoChange(sal_Bool bUndo)629cdf0e10cSrcweir void ScUndoPrintZoom::DoChange( sal_Bool bUndo )
630cdf0e10cSrcweir {
631cdf0e10cSrcweir 	sal_uInt16 nScale = bUndo ? nOldScale : nNewScale;
632cdf0e10cSrcweir 	sal_uInt16 nPages = bUndo ? nOldPages : nNewPages;
633cdf0e10cSrcweir 
634cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
635cdf0e10cSrcweir 	String aStyleName = pDoc->GetPageStyle( nTab );
636cdf0e10cSrcweir 	ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
637cdf0e10cSrcweir 	SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE );
638cdf0e10cSrcweir 	DBG_ASSERT( pStyleSheet, "PageStyle not found" );
639cdf0e10cSrcweir 	if ( pStyleSheet )
640cdf0e10cSrcweir 	{
641cdf0e10cSrcweir 		SfxItemSet& rSet = pStyleSheet->GetItemSet();
642cdf0e10cSrcweir 		rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALE, nScale ) );
643cdf0e10cSrcweir 		rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, nPages ) );
644cdf0e10cSrcweir 
645cdf0e10cSrcweir 		ScPrintFunc aPrintFunc( pDocShell, pDocShell->GetPrinter(), nTab );
646cdf0e10cSrcweir 		aPrintFunc.UpdatePages();
647cdf0e10cSrcweir 	}
648cdf0e10cSrcweir }
649cdf0e10cSrcweir 
Undo()650cdf0e10cSrcweir void __EXPORT ScUndoPrintZoom::Undo()
651cdf0e10cSrcweir {
652cdf0e10cSrcweir 	BeginUndo();
653cdf0e10cSrcweir 	DoChange(sal_True);
654cdf0e10cSrcweir 	EndUndo();
655cdf0e10cSrcweir }
656cdf0e10cSrcweir 
Redo()657cdf0e10cSrcweir void __EXPORT ScUndoPrintZoom::Redo()
658cdf0e10cSrcweir {
659cdf0e10cSrcweir 	BeginRedo();
660cdf0e10cSrcweir 	DoChange(sal_False);
661cdf0e10cSrcweir 	EndRedo();
662cdf0e10cSrcweir }
663cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)664cdf0e10cSrcweir void __EXPORT ScUndoPrintZoom::Repeat(SfxRepeatTarget& rTarget)
665cdf0e10cSrcweir {
666cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
667cdf0e10cSrcweir 	{
668cdf0e10cSrcweir 		ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
669cdf0e10cSrcweir 		ScViewData* pViewData = rViewShell.GetViewData();
670cdf0e10cSrcweir 		pViewData->GetDocShell()->SetPrintZoom( pViewData->GetTabNo(), nNewScale, nNewPages );
671cdf0e10cSrcweir 	}
672cdf0e10cSrcweir }
673cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const674cdf0e10cSrcweir sal_Bool __EXPORT ScUndoPrintZoom::CanRepeat(SfxRepeatTarget& rTarget) const
675cdf0e10cSrcweir {
676cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
677cdf0e10cSrcweir }
678cdf0e10cSrcweir 
679cdf0e10cSrcweir 
680cdf0e10cSrcweir // -----------------------------------------------------------------------
681cdf0e10cSrcweir //
682cdf0e10cSrcweir //		Thesaurus
683cdf0e10cSrcweir //
684cdf0e10cSrcweir 
ScUndoThesaurus(ScDocShell * pNewDocShell,SCCOL nNewCol,SCROW nNewRow,SCTAB nNewTab,const String & rNewUndoStr,const EditTextObject * pUndoTObj,const String & rNewRedoStr,const EditTextObject * pRedoTObj)685cdf0e10cSrcweir ScUndoThesaurus::ScUndoThesaurus( ScDocShell* pNewDocShell,
686cdf0e10cSrcweir 								  SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab,
687cdf0e10cSrcweir 								  const String& rNewUndoStr, const EditTextObject* pUndoTObj,
688cdf0e10cSrcweir 								  const String& rNewRedoStr, const EditTextObject* pRedoTObj) :
689cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
690cdf0e10cSrcweir 	nCol( nNewCol ),
691cdf0e10cSrcweir 	nRow( nNewRow ),
692cdf0e10cSrcweir 	nTab( nNewTab ),
693cdf0e10cSrcweir 	aUndoStr( rNewUndoStr ),
694cdf0e10cSrcweir 	aRedoStr( rNewRedoStr )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir 	pUndoTObject = (pUndoTObj) ? pUndoTObj->Clone() : NULL;
697cdf0e10cSrcweir 	pRedoTObject = (pRedoTObj) ? pRedoTObj->Clone() : NULL;
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 	ScBaseCell* pOldCell;
700cdf0e10cSrcweir 	if ( pUndoTObject )
701cdf0e10cSrcweir 		pOldCell = new ScEditCell( pUndoTObject, pDocShell->GetDocument(), NULL );
702cdf0e10cSrcweir 	else
703cdf0e10cSrcweir 		pOldCell = new ScStringCell( aUndoStr );
704cdf0e10cSrcweir 	SetChangeTrack( pOldCell );
705cdf0e10cSrcweir 	pOldCell->Delete();
706cdf0e10cSrcweir }
707cdf0e10cSrcweir 
~ScUndoThesaurus()708cdf0e10cSrcweir __EXPORT ScUndoThesaurus::~ScUndoThesaurus()
709cdf0e10cSrcweir {
710cdf0e10cSrcweir 	delete pUndoTObject;
711cdf0e10cSrcweir 	delete pRedoTObject;
712cdf0e10cSrcweir }
713cdf0e10cSrcweir 
GetComment() const714cdf0e10cSrcweir String __EXPORT ScUndoThesaurus::GetComment() const
715cdf0e10cSrcweir {
716cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_THESAURUS );	// "Thesaurus"
717cdf0e10cSrcweir }
718cdf0e10cSrcweir 
SetChangeTrack(ScBaseCell * pOldCell)719cdf0e10cSrcweir void ScUndoThesaurus::SetChangeTrack( ScBaseCell* pOldCell )
720cdf0e10cSrcweir {
721cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
722cdf0e10cSrcweir 	if ( pChangeTrack )
723cdf0e10cSrcweir 	{
724cdf0e10cSrcweir 		nEndChangeAction = pChangeTrack->GetActionMax() + 1;
725cdf0e10cSrcweir 		pChangeTrack->AppendContent( ScAddress( nCol, nRow, nTab ), pOldCell );
726cdf0e10cSrcweir 		if ( nEndChangeAction > pChangeTrack->GetActionMax() )
727cdf0e10cSrcweir 			nEndChangeAction = 0;		// nichts appended
728cdf0e10cSrcweir 	}
729cdf0e10cSrcweir 	else
730cdf0e10cSrcweir 		nEndChangeAction = 0;
731cdf0e10cSrcweir }
732cdf0e10cSrcweir 
DoChange(sal_Bool bUndo,const String & rStr,const EditTextObject * pTObj)733cdf0e10cSrcweir void __EXPORT ScUndoThesaurus::DoChange( sal_Bool bUndo, const String& rStr,
734cdf0e10cSrcweir 			const EditTextObject* pTObj )
735cdf0e10cSrcweir {
736cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
737cdf0e10cSrcweir 
738cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
739cdf0e10cSrcweir 	if (pViewShell)
740cdf0e10cSrcweir 	{
741cdf0e10cSrcweir 		pViewShell->SetTabNo( nTab );
742cdf0e10cSrcweir 		pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, sal_False, sal_False );
743cdf0e10cSrcweir 	}
744cdf0e10cSrcweir 
745cdf0e10cSrcweir 	if (pTObj)
746cdf0e10cSrcweir 	{
747cdf0e10cSrcweir 		ScBaseCell* pCell;
748cdf0e10cSrcweir 		pDoc->GetCell( nCol, nRow, nTab, pCell );
749cdf0e10cSrcweir 		if (pCell)
750cdf0e10cSrcweir 		{
751cdf0e10cSrcweir 			if (pCell->GetCellType() == CELLTYPE_EDIT )
752cdf0e10cSrcweir 			{
753cdf0e10cSrcweir 				ScEditCell* pNewCell = new ScEditCell( pTObj, pDoc, NULL );
754cdf0e10cSrcweir 				pDoc->PutCell( nCol, nRow, nTab, pNewCell );
755cdf0e10cSrcweir 				if ( !bUndo )
756cdf0e10cSrcweir 					SetChangeTrack( pCell );
757cdf0e10cSrcweir 			}
758cdf0e10cSrcweir 			else
759cdf0e10cSrcweir 			{
760cdf0e10cSrcweir 				DBG_ERROR("Nicht CELLTYPE_EDIT bei Un/RedoThesaurus");
761cdf0e10cSrcweir 			}
762cdf0e10cSrcweir 		}
763cdf0e10cSrcweir 	}
764cdf0e10cSrcweir 	else
765cdf0e10cSrcweir 	{
766cdf0e10cSrcweir         ScBaseCell* pCell = NULL;
767cdf0e10cSrcweir 		if ( !bUndo )
768cdf0e10cSrcweir 			pDoc->GetCell( nCol, nRow, nTab, pCell );
769cdf0e10cSrcweir 		pDoc->SetString( nCol, nRow, nTab, rStr );
770cdf0e10cSrcweir 		if ( !bUndo )
771cdf0e10cSrcweir 			SetChangeTrack( pCell );
772cdf0e10cSrcweir 	}
773cdf0e10cSrcweir 
774cdf0e10cSrcweir 	pDocShell->PostPaintCell( nCol, nRow, nTab );
775cdf0e10cSrcweir }
776cdf0e10cSrcweir 
Undo()777cdf0e10cSrcweir void __EXPORT ScUndoThesaurus::Undo()
778cdf0e10cSrcweir {
779cdf0e10cSrcweir 	BeginUndo();
780cdf0e10cSrcweir 	DoChange( sal_True, aUndoStr, pUndoTObject );
781cdf0e10cSrcweir 	ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
782cdf0e10cSrcweir 	if ( pChangeTrack )
783cdf0e10cSrcweir 		pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
784cdf0e10cSrcweir 	EndUndo();
785cdf0e10cSrcweir }
786cdf0e10cSrcweir 
Redo()787cdf0e10cSrcweir void __EXPORT ScUndoThesaurus::Redo()
788cdf0e10cSrcweir {
789cdf0e10cSrcweir 	BeginRedo();
790cdf0e10cSrcweir 	DoChange( sal_False, aRedoStr, pRedoTObject );
791cdf0e10cSrcweir 	EndRedo();
792cdf0e10cSrcweir }
793cdf0e10cSrcweir 
Repeat(SfxRepeatTarget & rTarget)794cdf0e10cSrcweir void __EXPORT ScUndoThesaurus::Repeat(SfxRepeatTarget& rTarget)
795cdf0e10cSrcweir {
796cdf0e10cSrcweir 	if (rTarget.ISA(ScTabViewTarget))
797cdf0e10cSrcweir 		((ScTabViewTarget&)rTarget).GetViewShell()->DoThesaurus( sal_True );
798cdf0e10cSrcweir }
799cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget & rTarget) const800cdf0e10cSrcweir sal_Bool __EXPORT ScUndoThesaurus::CanRepeat(SfxRepeatTarget& rTarget) const
801cdf0e10cSrcweir {
802cdf0e10cSrcweir 	return (rTarget.ISA(ScTabViewTarget));
803cdf0e10cSrcweir }
804cdf0e10cSrcweir 
805cdf0e10cSrcweir 
806cdf0e10cSrcweir // ============================================================================
807cdf0e10cSrcweir 
ScUndoReplaceNote(ScDocShell & rDocShell,const ScAddress & rPos,const ScNoteData & rNoteData,bool bInsert,SdrUndoAction * pDrawUndo)808cdf0e10cSrcweir ScUndoReplaceNote::ScUndoReplaceNote( ScDocShell& rDocShell, const ScAddress& rPos,
809cdf0e10cSrcweir         const ScNoteData& rNoteData, bool bInsert, SdrUndoAction* pDrawUndo ) :
810cdf0e10cSrcweir     ScSimpleUndo( &rDocShell ),
811cdf0e10cSrcweir     maPos( rPos ),
812cdf0e10cSrcweir     mpDrawUndo( pDrawUndo )
813cdf0e10cSrcweir {
814cdf0e10cSrcweir     DBG_ASSERT( rNoteData.mpCaption, "ScUndoReplaceNote::ScUndoReplaceNote - missing note caption" );
815cdf0e10cSrcweir     (bInsert ? maNewData : maOldData) = rNoteData;
816cdf0e10cSrcweir }
817cdf0e10cSrcweir 
ScUndoReplaceNote(ScDocShell & rDocShell,const ScAddress & rPos,const ScNoteData & rOldData,const ScNoteData & rNewData,SdrUndoAction * pDrawUndo)818cdf0e10cSrcweir ScUndoReplaceNote::ScUndoReplaceNote( ScDocShell& rDocShell, const ScAddress& rPos,
819cdf0e10cSrcweir         const ScNoteData& rOldData, const ScNoteData& rNewData, SdrUndoAction* pDrawUndo ) :
820cdf0e10cSrcweir     ScSimpleUndo( &rDocShell ),
821cdf0e10cSrcweir     maPos( rPos ),
822cdf0e10cSrcweir     maOldData( rOldData ),
823cdf0e10cSrcweir     maNewData( rNewData ),
824cdf0e10cSrcweir     mpDrawUndo( pDrawUndo )
825cdf0e10cSrcweir {
826cdf0e10cSrcweir     DBG_ASSERT( maOldData.mpCaption || maNewData.mpCaption, "ScUndoReplaceNote::ScUndoReplaceNote - missing note captions" );
827cdf0e10cSrcweir     DBG_ASSERT( !maOldData.mxInitData.get() && !maNewData.mxInitData.get(), "ScUndoReplaceNote::ScUndoReplaceNote - unexpected unitialized note" );
828cdf0e10cSrcweir }
829cdf0e10cSrcweir 
~ScUndoReplaceNote()830cdf0e10cSrcweir ScUndoReplaceNote::~ScUndoReplaceNote()
831cdf0e10cSrcweir {
832cdf0e10cSrcweir     DeleteSdrUndoAction( mpDrawUndo );
833cdf0e10cSrcweir }
834cdf0e10cSrcweir 
Undo()835cdf0e10cSrcweir void ScUndoReplaceNote::Undo()
836cdf0e10cSrcweir {
837cdf0e10cSrcweir 	BeginUndo();
838cdf0e10cSrcweir     DoSdrUndoAction( mpDrawUndo, pDocShell->GetDocument() );
839cdf0e10cSrcweir     /*  Undo insert -> remove new note.
840cdf0e10cSrcweir         Undo remove -> insert old note.
841cdf0e10cSrcweir         Undo replace -> remove new note, insert old note. */
842cdf0e10cSrcweir     DoRemoveNote( maNewData );
843cdf0e10cSrcweir     DoInsertNote( maOldData );
844cdf0e10cSrcweir     pDocShell->PostPaintCell( maPos );
845cdf0e10cSrcweir 	EndUndo();
846cdf0e10cSrcweir }
847cdf0e10cSrcweir 
Redo()848cdf0e10cSrcweir void ScUndoReplaceNote::Redo()
849cdf0e10cSrcweir {
850cdf0e10cSrcweir 	BeginRedo();
851cdf0e10cSrcweir     RedoSdrUndoAction( mpDrawUndo );
852cdf0e10cSrcweir     /*  Redo insert -> insert new note.
853cdf0e10cSrcweir         Redo remove -> remove old note.
854cdf0e10cSrcweir         Redo replace -> remove old note, insert new note. */
855cdf0e10cSrcweir     DoRemoveNote( maOldData );
856cdf0e10cSrcweir     DoInsertNote( maNewData );
857cdf0e10cSrcweir     pDocShell->PostPaintCell( maPos );
858cdf0e10cSrcweir 	EndRedo();
859cdf0e10cSrcweir }
860cdf0e10cSrcweir 
Repeat(SfxRepeatTarget &)861cdf0e10cSrcweir void ScUndoReplaceNote::Repeat( SfxRepeatTarget& /*rTarget*/ )
862cdf0e10cSrcweir {
863cdf0e10cSrcweir }
864cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget &) const865cdf0e10cSrcweir sal_Bool ScUndoReplaceNote::CanRepeat( SfxRepeatTarget& /*rTarget*/ ) const
866cdf0e10cSrcweir {
867cdf0e10cSrcweir 	return sal_False;
868cdf0e10cSrcweir }
869cdf0e10cSrcweir 
GetComment() const870cdf0e10cSrcweir String ScUndoReplaceNote::GetComment() const
871cdf0e10cSrcweir {
872cdf0e10cSrcweir     return ScGlobal::GetRscString( maNewData.mpCaption ?
873cdf0e10cSrcweir         (maOldData.mpCaption ? STR_UNDO_EDITNOTE : STR_UNDO_INSERTNOTE) : STR_UNDO_DELETENOTE );
874cdf0e10cSrcweir }
875cdf0e10cSrcweir 
DoInsertNote(const ScNoteData & rNoteData)876cdf0e10cSrcweir void ScUndoReplaceNote::DoInsertNote( const ScNoteData& rNoteData )
877cdf0e10cSrcweir {
878cdf0e10cSrcweir     if( rNoteData.mpCaption )
879cdf0e10cSrcweir     {
880cdf0e10cSrcweir         ScDocument& rDoc = *pDocShell->GetDocument();
881cdf0e10cSrcweir         DBG_ASSERT( !rDoc.GetNote( maPos ), "ScUndoReplaceNote::DoInsertNote - unexpected cell note" );
882cdf0e10cSrcweir         ScPostIt* pNote = new ScPostIt( rDoc, maPos, rNoteData, false );
883cdf0e10cSrcweir         rDoc.TakeNote( maPos, pNote );
884cdf0e10cSrcweir     }
885cdf0e10cSrcweir }
886cdf0e10cSrcweir 
DoRemoveNote(const ScNoteData & rNoteData)887cdf0e10cSrcweir void ScUndoReplaceNote::DoRemoveNote( const ScNoteData& rNoteData )
888cdf0e10cSrcweir {
889cdf0e10cSrcweir     if( rNoteData.mpCaption )
890cdf0e10cSrcweir     {
891cdf0e10cSrcweir         ScDocument& rDoc = *pDocShell->GetDocument();
892cdf0e10cSrcweir         DBG_ASSERT( rDoc.GetNote( maPos ), "ScUndoReplaceNote::DoRemoveNote - missing cell note" );
893cdf0e10cSrcweir         if( ScPostIt* pNote = rDoc.ReleaseNote( maPos ) )
894cdf0e10cSrcweir         {
895cdf0e10cSrcweir             /*  Forget pointer to caption object to suppress removing the
896cdf0e10cSrcweir                 caption object from the drawing layer while deleting pNote
897cdf0e10cSrcweir                 (removing the caption is done by a drawing undo action). */
898cdf0e10cSrcweir             pNote->ForgetCaption();
899cdf0e10cSrcweir             delete pNote;
900cdf0e10cSrcweir         }
901cdf0e10cSrcweir     }
902cdf0e10cSrcweir }
903cdf0e10cSrcweir 
904cdf0e10cSrcweir // ============================================================================
905cdf0e10cSrcweir 
ScUndoShowHideNote(ScDocShell & rDocShell,const ScAddress & rPos,bool bShow)906cdf0e10cSrcweir ScUndoShowHideNote::ScUndoShowHideNote( ScDocShell& rDocShell, const ScAddress& rPos, bool bShow ) :
907cdf0e10cSrcweir 	ScSimpleUndo( &rDocShell ),
908cdf0e10cSrcweir 	maPos( rPos ),
909cdf0e10cSrcweir 	mbShown( bShow )
910cdf0e10cSrcweir {
911cdf0e10cSrcweir }
912cdf0e10cSrcweir 
~ScUndoShowHideNote()913cdf0e10cSrcweir ScUndoShowHideNote::~ScUndoShowHideNote()
914cdf0e10cSrcweir {
915cdf0e10cSrcweir }
916cdf0e10cSrcweir 
Undo()917cdf0e10cSrcweir void ScUndoShowHideNote::Undo()
918cdf0e10cSrcweir {
919cdf0e10cSrcweir 	BeginUndo();
920cdf0e10cSrcweir 	if( ScPostIt* pNote = pDocShell->GetDocument()->GetNote( maPos ) )
921cdf0e10cSrcweir         pNote->ShowCaption( maPos, !mbShown );
922cdf0e10cSrcweir 	EndUndo();
923cdf0e10cSrcweir }
924cdf0e10cSrcweir 
Redo()925cdf0e10cSrcweir void ScUndoShowHideNote::Redo()
926cdf0e10cSrcweir {
927cdf0e10cSrcweir 	BeginRedo();
928cdf0e10cSrcweir 	if( ScPostIt* pNote = pDocShell->GetDocument()->GetNote( maPos ) )
929cdf0e10cSrcweir         pNote->ShowCaption( maPos, mbShown );
930cdf0e10cSrcweir 	EndRedo();
931cdf0e10cSrcweir }
932cdf0e10cSrcweir 
Repeat(SfxRepeatTarget &)933cdf0e10cSrcweir void ScUndoShowHideNote::Repeat( SfxRepeatTarget& /*rTarget*/ )
934cdf0e10cSrcweir {
935cdf0e10cSrcweir }
936cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget &) const937cdf0e10cSrcweir sal_Bool ScUndoShowHideNote::CanRepeat( SfxRepeatTarget& /*rTarget*/ ) const
938cdf0e10cSrcweir {
939cdf0e10cSrcweir 	return sal_False;
940cdf0e10cSrcweir }
941cdf0e10cSrcweir 
GetComment() const942cdf0e10cSrcweir String ScUndoShowHideNote::GetComment() const
943cdf0e10cSrcweir {
944cdf0e10cSrcweir     return ScGlobal::GetRscString( mbShown ? STR_UNDO_SHOWNOTE : STR_UNDO_HIDENOTE );
945cdf0e10cSrcweir }
946cdf0e10cSrcweir 
947cdf0e10cSrcweir // ============================================================================
948cdf0e10cSrcweir 
949cdf0e10cSrcweir // -----------------------------------------------------------------------
950cdf0e10cSrcweir //
951cdf0e10cSrcweir //		Detektiv
952cdf0e10cSrcweir //
953cdf0e10cSrcweir 
ScUndoDetective(ScDocShell * pNewDocShell,SdrUndoAction * pDraw,const ScDetOpData * pOperation,ScDetOpList * pUndoList)954cdf0e10cSrcweir ScUndoDetective::ScUndoDetective( ScDocShell* pNewDocShell,
955cdf0e10cSrcweir 									SdrUndoAction* pDraw, const ScDetOpData* pOperation,
956cdf0e10cSrcweir 									ScDetOpList* pUndoList ) :
957cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
958cdf0e10cSrcweir 	pOldList	( pUndoList ),
959cdf0e10cSrcweir 	nAction		( 0 ),
960cdf0e10cSrcweir 	pDrawUndo	( pDraw )
961cdf0e10cSrcweir {
962cdf0e10cSrcweir 	bIsDelete = ( pOperation == NULL );
963cdf0e10cSrcweir 	if (!bIsDelete)
964cdf0e10cSrcweir 	{
965cdf0e10cSrcweir 		nAction = (sal_uInt16) pOperation->GetOperation();
966cdf0e10cSrcweir 		aPos = pOperation->GetPos();
967cdf0e10cSrcweir 	}
968cdf0e10cSrcweir }
969cdf0e10cSrcweir 
~ScUndoDetective()970cdf0e10cSrcweir __EXPORT ScUndoDetective::~ScUndoDetective()
971cdf0e10cSrcweir {
972cdf0e10cSrcweir 	DeleteSdrUndoAction( pDrawUndo );
973cdf0e10cSrcweir 	delete pOldList;
974cdf0e10cSrcweir }
975cdf0e10cSrcweir 
GetComment() const976cdf0e10cSrcweir String __EXPORT ScUndoDetective::GetComment() const
977cdf0e10cSrcweir {
978cdf0e10cSrcweir 	sal_uInt16 nId = STR_UNDO_DETDELALL;
979cdf0e10cSrcweir 	if ( !bIsDelete )
980cdf0e10cSrcweir 		switch ( (ScDetOpType) nAction )
981cdf0e10cSrcweir 		{
982cdf0e10cSrcweir 			case SCDETOP_ADDSUCC:	nId = STR_UNDO_DETADDSUCC;	break;
983cdf0e10cSrcweir 			case SCDETOP_DELSUCC:	nId = STR_UNDO_DETDELSUCC;	break;
984cdf0e10cSrcweir 			case SCDETOP_ADDPRED:	nId = STR_UNDO_DETADDPRED;	break;
985cdf0e10cSrcweir 			case SCDETOP_DELPRED:	nId = STR_UNDO_DETDELPRED;	break;
986cdf0e10cSrcweir 			case SCDETOP_ADDERROR:	nId = STR_UNDO_DETADDERROR;	break;
987cdf0e10cSrcweir 		}
988cdf0e10cSrcweir 
989cdf0e10cSrcweir 	return ScGlobal::GetRscString( nId );
990cdf0e10cSrcweir }
991cdf0e10cSrcweir 
992cdf0e10cSrcweir 
Undo()993cdf0e10cSrcweir void __EXPORT ScUndoDetective::Undo()
994cdf0e10cSrcweir {
995cdf0e10cSrcweir 	BeginUndo();
996cdf0e10cSrcweir 
997cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
998cdf0e10cSrcweir     DoSdrUndoAction(pDrawUndo, pDoc);
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir 	if (bIsDelete)
1001cdf0e10cSrcweir 	{
1002cdf0e10cSrcweir 		if ( pOldList )
1003cdf0e10cSrcweir 			pDoc->SetDetOpList( new ScDetOpList(*pOldList) );
1004cdf0e10cSrcweir 	}
1005cdf0e10cSrcweir 	else
1006cdf0e10cSrcweir 	{
1007cdf0e10cSrcweir 		//	Eintrag aus der Liste loeschen
1008cdf0e10cSrcweir 
1009cdf0e10cSrcweir 		ScDetOpList* pList = pDoc->GetDetOpList();
1010cdf0e10cSrcweir 		if (pList && pList->Count())
1011cdf0e10cSrcweir 		{
1012cdf0e10cSrcweir 			sal_uInt16 nPos = pList->Count() - 1;
1013cdf0e10cSrcweir 			ScDetOpData* pData = (*pList)[nPos];
1014cdf0e10cSrcweir 			if ( pData->GetOperation() == (ScDetOpType) nAction && pData->GetPos() == aPos )
1015cdf0e10cSrcweir 				pList->DeleteAndDestroy( nPos, 1 );
1016cdf0e10cSrcweir 			else
1017cdf0e10cSrcweir 			{
1018cdf0e10cSrcweir 				DBG_ERROR("Detektiv-Eintrag in der Liste nicht gefunden");
1019cdf0e10cSrcweir 			}
1020cdf0e10cSrcweir 		}
1021cdf0e10cSrcweir 	}
1022cdf0e10cSrcweir 
1023cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1024cdf0e10cSrcweir 	if (pViewShell)
1025cdf0e10cSrcweir 		pViewShell->RecalcPPT();	//! use broadcast instead?
1026cdf0e10cSrcweir 
1027cdf0e10cSrcweir 	EndUndo();
1028cdf0e10cSrcweir }
1029cdf0e10cSrcweir 
Redo()1030cdf0e10cSrcweir void __EXPORT ScUndoDetective::Redo()
1031cdf0e10cSrcweir {
1032cdf0e10cSrcweir 	BeginRedo();
1033cdf0e10cSrcweir 
1034cdf0e10cSrcweir     RedoSdrUndoAction(pDrawUndo);
1035cdf0e10cSrcweir 
1036cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir 	if (bIsDelete)
1039cdf0e10cSrcweir 		pDoc->ClearDetectiveOperations();
1040cdf0e10cSrcweir 	else
1041cdf0e10cSrcweir 		pDoc->AddDetectiveOperation( ScDetOpData( aPos, (ScDetOpType) nAction ) );
1042cdf0e10cSrcweir 
1043cdf0e10cSrcweir 	ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1044cdf0e10cSrcweir 	if (pViewShell)
1045cdf0e10cSrcweir 		pViewShell->RecalcPPT();	//! use broadcast instead?
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir 	EndRedo();
1048cdf0e10cSrcweir }
1049cdf0e10cSrcweir 
Repeat(SfxRepeatTarget &)1050cdf0e10cSrcweir void __EXPORT ScUndoDetective::Repeat(SfxRepeatTarget& /* rTarget */)
1051cdf0e10cSrcweir {
1052cdf0e10cSrcweir 	//	hammanich
1053cdf0e10cSrcweir }
1054cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget &) const1055cdf0e10cSrcweir sal_Bool __EXPORT ScUndoDetective::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1056cdf0e10cSrcweir {
1057cdf0e10cSrcweir 	return sal_False;
1058cdf0e10cSrcweir }
1059cdf0e10cSrcweir 
1060cdf0e10cSrcweir // -----------------------------------------------------------------------
1061cdf0e10cSrcweir //
1062cdf0e10cSrcweir //		Benannte Bereiche
1063cdf0e10cSrcweir //
1064cdf0e10cSrcweir 
ScUndoRangeNames(ScDocShell * pNewDocShell,ScRangeName * pOld,ScRangeName * pNew)1065cdf0e10cSrcweir ScUndoRangeNames::ScUndoRangeNames( ScDocShell* pNewDocShell,
1066cdf0e10cSrcweir 									ScRangeName* pOld, ScRangeName* pNew ) :
1067cdf0e10cSrcweir 	ScSimpleUndo( pNewDocShell ),
1068cdf0e10cSrcweir 	pOldRanges	( pOld ),
1069cdf0e10cSrcweir 	pNewRanges	( pNew )
1070cdf0e10cSrcweir {
1071cdf0e10cSrcweir }
1072cdf0e10cSrcweir 
~ScUndoRangeNames()1073cdf0e10cSrcweir __EXPORT ScUndoRangeNames::~ScUndoRangeNames()
1074cdf0e10cSrcweir {
1075cdf0e10cSrcweir 	delete pOldRanges;
1076cdf0e10cSrcweir 	delete pNewRanges;
1077cdf0e10cSrcweir }
1078cdf0e10cSrcweir 
GetComment() const1079cdf0e10cSrcweir String __EXPORT ScUndoRangeNames::GetComment() const
1080cdf0e10cSrcweir {
1081cdf0e10cSrcweir 	return ScGlobal::GetRscString( STR_UNDO_RANGENAMES );
1082cdf0e10cSrcweir }
1083cdf0e10cSrcweir 
DoChange(sal_Bool bUndo)1084cdf0e10cSrcweir void ScUndoRangeNames::DoChange( sal_Bool bUndo )
1085cdf0e10cSrcweir {
1086cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
1087cdf0e10cSrcweir 	pDoc->CompileNameFormula( sal_True );	// CreateFormulaString
1088cdf0e10cSrcweir 
1089cdf0e10cSrcweir 	if ( bUndo )
1090cdf0e10cSrcweir 		pDoc->SetRangeName( new ScRangeName( *pOldRanges ) );
1091cdf0e10cSrcweir 	else
1092cdf0e10cSrcweir 		pDoc->SetRangeName( new ScRangeName( *pNewRanges ) );
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir 	pDoc->CompileNameFormula( sal_False );	// CompileFormulaString
1095cdf0e10cSrcweir 
1096cdf0e10cSrcweir 	SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
1097cdf0e10cSrcweir }
1098cdf0e10cSrcweir 
Undo()1099cdf0e10cSrcweir void __EXPORT ScUndoRangeNames::Undo()
1100cdf0e10cSrcweir {
1101cdf0e10cSrcweir 	BeginUndo();
1102cdf0e10cSrcweir 	DoChange( sal_True );
1103cdf0e10cSrcweir 	EndUndo();
1104cdf0e10cSrcweir }
1105cdf0e10cSrcweir 
Redo()1106cdf0e10cSrcweir void __EXPORT ScUndoRangeNames::Redo()
1107cdf0e10cSrcweir {
1108cdf0e10cSrcweir 	BeginRedo();
1109cdf0e10cSrcweir 	DoChange( sal_False );
1110cdf0e10cSrcweir 	EndRedo();
1111cdf0e10cSrcweir }
1112cdf0e10cSrcweir 
Repeat(SfxRepeatTarget &)1113cdf0e10cSrcweir void __EXPORT ScUndoRangeNames::Repeat(SfxRepeatTarget& /* rTarget */)
1114cdf0e10cSrcweir {
1115cdf0e10cSrcweir 	//	hammanich
1116cdf0e10cSrcweir }
1117cdf0e10cSrcweir 
CanRepeat(SfxRepeatTarget &) const1118cdf0e10cSrcweir sal_Bool __EXPORT ScUndoRangeNames::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1119cdf0e10cSrcweir {
1120cdf0e10cSrcweir 	return sal_False;
1121cdf0e10cSrcweir }
1122cdf0e10cSrcweir 
1123cdf0e10cSrcweir 
1124cdf0e10cSrcweir 
1125cdf0e10cSrcweir 
1126