xref: /trunk/main/sc/source/ui/undo/refundo.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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 "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 }
207