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)51cdf0e10cSrcweirScRefUndoData::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()83cdf0e10cSrcweirScRefUndoData::~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)96cdf0e10cSrcweirvoid 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)165cdf0e10cSrcweirvoid 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