xref: /aoo41x/main/sc/source/ui/undo/refundo.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 // -----------------------------------------------------------------------
28cdf0e10cSrcweir 
29cdf0e10cSrcweir 
30cdf0e10cSrcweir 
31cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include "refundo.hxx"
34cdf0e10cSrcweir #include "undobase.hxx"
35cdf0e10cSrcweir #include "document.hxx"
36cdf0e10cSrcweir #include "dbcolect.hxx"
37cdf0e10cSrcweir #include "rangenam.hxx"
38cdf0e10cSrcweir #include "pivot.hxx"
39cdf0e10cSrcweir #include "chartarr.hxx"
40cdf0e10cSrcweir #include "stlpool.hxx"
41cdf0e10cSrcweir #include "conditio.hxx"
42cdf0e10cSrcweir #include "detdata.hxx"
43cdf0e10cSrcweir #include "prnsave.hxx"
44cdf0e10cSrcweir #include "chartlis.hxx"
45cdf0e10cSrcweir #include "dpobject.hxx"
46cdf0e10cSrcweir #include "areasave.hxx"
47cdf0e10cSrcweir #include "unoreflist.hxx"
48cdf0e10cSrcweir 
49cdf0e10cSrcweir // -----------------------------------------------------------------------
50cdf0e10cSrcweir 
ScRefUndoData(const ScDocument * pDoc)51cdf0e10cSrcweir ScRefUndoData::ScRefUndoData( const ScDocument* pDoc ) :
52cdf0e10cSrcweir     pUnoRefs( NULL )
53cdf0e10cSrcweir {
54cdf0e10cSrcweir 	ScDBCollection* pOldDBColl = pDoc->GetDBCollection();
55cdf0e10cSrcweir 	pDBCollection = pOldDBColl ? new ScDBCollection(*pOldDBColl) : NULL;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 	ScRangeName* pOldRanges = ((ScDocument*)pDoc)->GetRangeName();			//! const
58cdf0e10cSrcweir 	pRangeName = pOldRanges ? new ScRangeName(*pOldRanges) : NULL;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 	pPrintRanges = pDoc->CreatePrintRangeSaver();		// neu erzeugt
61cdf0e10cSrcweir 
62cdf0e10cSrcweir 	//!	bei Pivot nur Bereiche merken ???
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 	ScDPCollection* pOldDP = ((ScDocument*)pDoc)->GetDPCollection();		//! const
65cdf0e10cSrcweir 	pDPCollection = pOldDP ? new ScDPCollection(*pOldDP) : NULL;
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 	ScConditionalFormatList* pOldCond = pDoc->GetCondFormList();
68cdf0e10cSrcweir 	pCondFormList = pOldCond ? new ScConditionalFormatList(*pOldCond) : NULL;
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 	ScDetOpList* pOldDetOp = pDoc->GetDetOpList();
71cdf0e10cSrcweir 	pDetOpList = pOldDetOp ? new ScDetOpList(*pOldDetOp) : 0;
72cdf0e10cSrcweir 
73cdf0e10cSrcweir 	ScChartListenerCollection* pOldChartListenerCollection =
74cdf0e10cSrcweir 		pDoc->GetChartListenerCollection();
75cdf0e10cSrcweir 	pChartListenerCollection = pOldChartListenerCollection ?
76cdf0e10cSrcweir 		new ScChartListenerCollection( *pOldChartListenerCollection ) : NULL;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir 	pAreaLinks = ScAreaLinkSaveCollection::CreateFromDoc(pDoc);		// returns NULL if empty
79cdf0e10cSrcweir 
80cdf0e10cSrcweir     const_cast<ScDocument*>(pDoc)->BeginUnoRefUndo();
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
~ScRefUndoData()83cdf0e10cSrcweir ScRefUndoData::~ScRefUndoData()
84cdf0e10cSrcweir {
85cdf0e10cSrcweir 	delete pDBCollection;
86cdf0e10cSrcweir 	delete pRangeName;
87cdf0e10cSrcweir 	delete pPrintRanges;
88cdf0e10cSrcweir 	delete pDPCollection;
89cdf0e10cSrcweir 	delete pCondFormList;
90cdf0e10cSrcweir 	delete pDetOpList;
91cdf0e10cSrcweir 	delete pChartListenerCollection;
92cdf0e10cSrcweir 	delete pAreaLinks;
93cdf0e10cSrcweir     delete pUnoRefs;
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
DeleteUnchanged(const ScDocument * pDoc)96cdf0e10cSrcweir void ScRefUndoData::DeleteUnchanged( const ScDocument* pDoc )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir 	if (pDBCollection)
99cdf0e10cSrcweir 	{
100cdf0e10cSrcweir 		ScDBCollection* pNewDBColl = pDoc->GetDBCollection();
101cdf0e10cSrcweir 		if ( pNewDBColl && *pDBCollection == *pNewDBColl )
102cdf0e10cSrcweir 			DELETEZ(pDBCollection);
103cdf0e10cSrcweir 	}
104cdf0e10cSrcweir 	if (pRangeName)
105cdf0e10cSrcweir 	{
106cdf0e10cSrcweir 		ScRangeName* pNewRanges = ((ScDocument*)pDoc)->GetRangeName();		//! const
107cdf0e10cSrcweir 		if ( pNewRanges && *pRangeName == *pNewRanges )
108cdf0e10cSrcweir 			DELETEZ(pRangeName);
109cdf0e10cSrcweir 	}
110cdf0e10cSrcweir 
111cdf0e10cSrcweir 	if (pPrintRanges)
112cdf0e10cSrcweir 	{
113cdf0e10cSrcweir 		ScPrintRangeSaver* pNewRanges = pDoc->CreatePrintRangeSaver();
114cdf0e10cSrcweir 		if ( pNewRanges && *pPrintRanges == *pNewRanges )
115cdf0e10cSrcweir 			DELETEZ(pPrintRanges);
116cdf0e10cSrcweir 		delete pNewRanges;
117cdf0e10cSrcweir 	}
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	if (pDPCollection)
120cdf0e10cSrcweir 	{
121cdf0e10cSrcweir 		ScDPCollection* pNewDP = ((ScDocument*)pDoc)->GetDPCollection();	//! const
122cdf0e10cSrcweir 		if ( pNewDP && pDPCollection->RefsEqual(*pNewDP) )
123cdf0e10cSrcweir 			DELETEZ(pDPCollection);
124cdf0e10cSrcweir 	}
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 	if (pCondFormList)
127cdf0e10cSrcweir 	{
128cdf0e10cSrcweir 		ScConditionalFormatList* pNewCond = pDoc->GetCondFormList();
129cdf0e10cSrcweir 		if ( pNewCond && *pCondFormList == *pNewCond )
130cdf0e10cSrcweir 			DELETEZ(pCondFormList);
131cdf0e10cSrcweir 	}
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 	if (pDetOpList)
134cdf0e10cSrcweir 	{
135cdf0e10cSrcweir 		ScDetOpList* pNewDetOp = pDoc->GetDetOpList();
136cdf0e10cSrcweir 		if ( pNewDetOp && *pDetOpList == *pNewDetOp )
137cdf0e10cSrcweir 			DELETEZ(pDetOpList);
138cdf0e10cSrcweir 	}
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 	if ( pChartListenerCollection )
141cdf0e10cSrcweir 	{
142cdf0e10cSrcweir 		ScChartListenerCollection* pNewChartListenerCollection =
143cdf0e10cSrcweir 			pDoc->GetChartListenerCollection();
144cdf0e10cSrcweir 		if ( pNewChartListenerCollection &&
145cdf0e10cSrcweir 				*pChartListenerCollection == *pNewChartListenerCollection )
146cdf0e10cSrcweir 			DELETEZ( pChartListenerCollection );
147cdf0e10cSrcweir 	}
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 	if (pAreaLinks)
150cdf0e10cSrcweir 	{
151cdf0e10cSrcweir 		if ( pAreaLinks->IsEqual( pDoc ) )
152cdf0e10cSrcweir 			DELETEZ(pAreaLinks);
153cdf0e10cSrcweir 	}
154cdf0e10cSrcweir 
155cdf0e10cSrcweir     if ( pDoc->HasUnoRefUndo() )
156cdf0e10cSrcweir     {
157cdf0e10cSrcweir         pUnoRefs = const_cast<ScDocument*>(pDoc)->EndUnoRefUndo();
158cdf0e10cSrcweir         if ( pUnoRefs && pUnoRefs->IsEmpty() )
159cdf0e10cSrcweir         {
160cdf0e10cSrcweir             DELETEZ( pUnoRefs );
161cdf0e10cSrcweir         }
162cdf0e10cSrcweir     }
163cdf0e10cSrcweir }
164cdf0e10cSrcweir 
DoUndo(ScDocument * pDoc,sal_Bool bUndoRefFirst)165cdf0e10cSrcweir void ScRefUndoData::DoUndo( ScDocument* pDoc, sal_Bool bUndoRefFirst )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir 	if (pDBCollection)
168cdf0e10cSrcweir 		pDoc->SetDBCollection( new ScDBCollection(*pDBCollection) );
169cdf0e10cSrcweir 	if (pRangeName)
170cdf0e10cSrcweir 		pDoc->SetRangeName( new ScRangeName(*pRangeName) );
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 	if (pPrintRanges)
173cdf0e10cSrcweir 		pDoc->RestorePrintRanges(*pPrintRanges);
174cdf0e10cSrcweir 
175cdf0e10cSrcweir 	if (pDPCollection)
176cdf0e10cSrcweir 	{
177cdf0e10cSrcweir 		ScDPCollection* pDocDP = pDoc->GetDPCollection();
178cdf0e10cSrcweir 		if (pDocDP)
179cdf0e10cSrcweir 			pDPCollection->WriteRefsTo( *pDocDP );
180cdf0e10cSrcweir 	}
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 	if (pCondFormList)
183cdf0e10cSrcweir 		pDoc->SetCondFormList( new ScConditionalFormatList(*pCondFormList) );
184cdf0e10cSrcweir 	if (pDetOpList)
185cdf0e10cSrcweir 		pDoc->SetDetOpList( new ScDetOpList(*pDetOpList) );
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 	// #65055# bUndoRefFirst ist bSetChartRangeLists
188cdf0e10cSrcweir 	if ( pChartListenerCollection )
189cdf0e10cSrcweir 		pDoc->SetChartListenerCollection( new ScChartListenerCollection(
190cdf0e10cSrcweir 			*pChartListenerCollection ), bUndoRefFirst );
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 	if (pDBCollection || pRangeName)
193cdf0e10cSrcweir 	{
194cdf0e10cSrcweir 		sal_Bool bOldAutoCalc = pDoc->GetAutoCalc();
195cdf0e10cSrcweir 		pDoc->SetAutoCalc( sal_False );	// Mehrfachberechnungen vermeiden
196cdf0e10cSrcweir 		pDoc->CompileAll();
197cdf0e10cSrcweir 		pDoc->SetDirty();
198cdf0e10cSrcweir 		pDoc->SetAutoCalc( bOldAutoCalc );
199cdf0e10cSrcweir 	}
200cdf0e10cSrcweir 
201cdf0e10cSrcweir 	if (pAreaLinks)
202cdf0e10cSrcweir 		pAreaLinks->Restore( pDoc );
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     if ( pUnoRefs )
205cdf0e10cSrcweir         pUnoRefs->Undo( pDoc );
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 
210cdf0e10cSrcweir 
211