summaryrefslogtreecommitdiff
path: root/binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingImportHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingImportHelper.cxx')
-rw-r--r--binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingImportHelper.cxx836
1 files changed, 836 insertions, 0 deletions
diff --git a/binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingImportHelper.cxx b/binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingImportHelper.cxx
new file mode 100644
index 000000000000..e8410ae1c180
--- /dev/null
+++ b/binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingImportHelper.cxx
@@ -0,0 +1,836 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "XMLChangeTrackingImportHelper.hxx"
+#include "XMLConverter.hxx"
+#include "cell.hxx"
+
+#include <bf_svtools/zforlist.hxx>
+
+#include <bf_xmloff/xmluconv.hxx>
+namespace binfilter {
+
+#define SC_CHANGE_ID_PREFIX "ct"
+
+ScMyCellInfo::ScMyCellInfo(ScBaseCell* pTempCell, const ::rtl::OUString& rFormulaAddress, const ::rtl::OUString& rFormula,
+ const double& rValue, const sal_uInt16 nTempType, const sal_uInt8 nTempMatrixFlag, const sal_Int32 nTempMatrixCols,
+ const sal_Int32 nTempMatrixRows)
+ : pCell(pTempCell),
+ sFormulaAddress(rFormulaAddress),
+ sFormula(rFormula),
+ fValue(rValue),
+ nType(nTempType),
+ nMatrixFlag(nTempMatrixFlag),
+ nMatrixCols(nTempMatrixCols),
+ nMatrixRows(nTempMatrixRows)
+{
+}
+
+ScMyCellInfo::~ScMyCellInfo()
+{
+ if (pCell)
+ pCell->Delete();
+}
+
+ScBaseCell* ScMyCellInfo::CreateCell(ScDocument* pDoc)
+{
+ if (pDoc)
+ {
+ if (!pCell && sFormula.getLength() && sFormulaAddress.getLength())
+ {
+ ScAddress aPos;
+ sal_Int32 nOffset(0);
+ ScXMLConverter::GetAddressFromString(aPos, sFormulaAddress, pDoc, nOffset);
+ pCell = new ScFormulaCell(pDoc, aPos, sFormula, nMatrixFlag);
+ static_cast<ScFormulaCell*>(pCell)->SetMatColsRows(static_cast<sal_uInt16>(nMatrixCols), static_cast<sal_uInt16>(nMatrixRows));
+ }
+
+ if (nType != NUMBERFORMAT_ALL)
+ {
+ if (nType == NUMBERFORMAT_DATE)
+ pDoc->GetFormatTable()->GetInputLineString(fValue, NF_DATE_SYS_DDMMYYYY, sResult);
+ else if (nType == NUMBERFORMAT_TIME)
+ pDoc->GetFormatTable()->GetInputLineString(fValue, NF_TIME_HHMMSS, sResult);
+ }
+ }
+
+ if (pCell)
+ return pCell->Clone(pDoc);
+ else
+ return NULL;
+}
+
+ScMyDeleted::ScMyDeleted()
+ : pCellInfo(NULL)
+{
+}
+
+ScMyDeleted::~ScMyDeleted()
+{
+ if (pCellInfo)
+ delete pCellInfo;
+}
+
+ScMyGenerated::ScMyGenerated(ScMyCellInfo* pTempCellInfo, const ScBigRange& aTempBigRange)
+ : aBigRange(aTempBigRange),
+ nID(0),
+ pCellInfo(pTempCellInfo)
+{
+}
+
+ScMyGenerated::~ScMyGenerated()
+{
+ if (pCellInfo)
+ delete pCellInfo;
+}
+
+ScMyBaseAction::ScMyBaseAction(const ScChangeActionType nTempActionType)
+ : aDependences(),
+ aDeletedList(),
+ nActionNumber(0),
+ nRejectingNumber(0),
+ nPreviousAction(0),
+ nActionType(nTempActionType),
+ nActionState(SC_CAS_VIRGIN)
+{
+}
+
+ScMyBaseAction::~ScMyBaseAction()
+{
+}
+
+ScMyInsAction::ScMyInsAction(const ScChangeActionType nActionType)
+ : ScMyBaseAction(nActionType)
+{
+}
+
+ScMyDelAction::ScMyDelAction(const ScChangeActionType nActionType)
+ : ScMyBaseAction(nActionType),
+ pInsCutOff(NULL),
+ aMoveCutOffs(),
+ aGeneratedList(),
+ nD(0)
+{
+}
+
+ScMyDelAction::~ScMyDelAction()
+{
+ if (pInsCutOff)
+ delete pInsCutOff;
+}
+
+ScMyMoveAction::ScMyMoveAction()
+ : ScMyBaseAction(SC_CAT_MOVE),
+ pMoveRanges(NULL),
+ aGeneratedList()
+{
+}
+
+ScMyMoveAction::~ScMyMoveAction()
+{
+ if (pMoveRanges)
+ delete pMoveRanges;
+}
+
+
+ScMyContentAction::ScMyContentAction()
+ : ScMyBaseAction(SC_CAT_CONTENT),
+ pCellInfo(NULL)
+{
+}
+
+ScMyContentAction::~ScMyContentAction()
+{
+ if (pCellInfo)
+ delete pCellInfo;
+}
+
+ScMyRejAction::ScMyRejAction()
+ : ScMyBaseAction(SC_CAT_REJECT)
+{
+}
+
+ScXMLChangeTrackingImportHelper::ScXMLChangeTrackingImportHelper()
+ : sIDPrefix(RTL_CONSTASCII_USTRINGPARAM(SC_CHANGE_ID_PREFIX)),
+ aActions(),
+ aUsers(),
+ nMultiSpanned(0),
+ nMultiSpannedSlaveCount(0),
+ pCurrentAction(NULL),
+ pDoc(NULL),
+ pTrack(NULL),
+ bChangeTrack(sal_False)
+{
+ nPrefixLength = sIDPrefix.getLength();
+}
+
+ScXMLChangeTrackingImportHelper::~ScXMLChangeTrackingImportHelper()
+{
+}
+
+void ScXMLChangeTrackingImportHelper::StartChangeAction(const ScChangeActionType nActionType)
+{
+ DBG_ASSERT(!pCurrentAction, "a not inserted action");
+ switch (nActionType)
+ {
+ case SC_CAT_INSERT_COLS:
+ case SC_CAT_INSERT_ROWS:
+ case SC_CAT_INSERT_TABS:
+ {
+ pCurrentAction = new ScMyInsAction(nActionType);
+ }
+ break;
+ case SC_CAT_DELETE_COLS:
+ case SC_CAT_DELETE_ROWS:
+ case SC_CAT_DELETE_TABS:
+ {
+ pCurrentAction = new ScMyDelAction(nActionType);
+ }
+ break;
+ case SC_CAT_MOVE:
+ {
+ pCurrentAction = new ScMyMoveAction();
+ }
+ break;
+ case SC_CAT_CONTENT:
+ {
+ pCurrentAction = new ScMyContentAction();
+ }
+ break;
+ case SC_CAT_REJECT:
+ {
+ pCurrentAction = new ScMyRejAction();
+ }
+ break;
+ }
+}
+
+sal_uInt32 ScXMLChangeTrackingImportHelper::GetIDFromString(const ::rtl::OUString& sID)
+{
+ sal_uInt32 nResult(0);
+ sal_uInt32 nLength(sID.getLength());
+ if (nLength)
+ {
+ if (sID.compareTo(sIDPrefix, nPrefixLength) == 0)
+ {
+ ::rtl::OUString sValue(sID.copy(nPrefixLength, nLength - nPrefixLength));
+ sal_Int32 nValue;
+ SvXMLUnitConverter::convertNumber(nValue, sValue);
+ DBG_ASSERT(nValue > 0, "wrong change action ID");
+ nResult = nValue;
+ }
+ else
+ DBG_ERROR("wrong change action ID");
+ }
+ return nResult;
+}
+
+void ScXMLChangeTrackingImportHelper::SetActionInfo(const ScMyActionInfo& aInfo)
+{
+ pCurrentAction->aInfo = aInfo;
+ String aUser(aInfo.sUser);
+ StrData* pStrData = new StrData( aUser );
+ if ( !aUsers.Insert( pStrData ) )
+ delete pStrData;
+}
+
+void ScXMLChangeTrackingImportHelper::SetPreviousChange(const sal_uInt32 nPreviousAction,
+ ScMyCellInfo* pCellInfo)
+{
+ DBG_ASSERT(pCurrentAction->nActionType == SC_CAT_CONTENT, "wrong action type");
+ ScMyContentAction* pAction = static_cast<ScMyContentAction*>(pCurrentAction);
+ pAction->nPreviousAction = nPreviousAction;
+ pAction->pCellInfo = pCellInfo;
+}
+
+void ScXMLChangeTrackingImportHelper::SetPosition(const sal_Int32 nPosition, const sal_Int32 nCount, const sal_Int32 nTable)
+{
+ DBG_ASSERT(((pCurrentAction->nActionType != SC_CAT_MOVE) &&
+ (pCurrentAction->nActionType != SC_CAT_CONTENT) &&
+ (pCurrentAction->nActionType != SC_CAT_REJECT)), "wrong action type");
+ DBG_ASSERT(nCount > 0, "wrong count");
+ switch(pCurrentAction->nActionType)
+ {
+ case SC_CAT_INSERT_COLS:
+ case SC_CAT_DELETE_COLS:
+ {
+ pCurrentAction->aBigRange.Set(nPosition, nInt32Min, nTable,
+ nPosition + nCount - 1, nInt32Max, nTable);
+ }
+ break;
+ case SC_CAT_INSERT_ROWS:
+ case SC_CAT_DELETE_ROWS:
+ {
+ pCurrentAction->aBigRange.Set(nInt32Min, nPosition, nTable,
+ nInt32Max, nPosition + nCount - 1, nTable);
+ }
+ break;
+ case SC_CAT_INSERT_TABS:
+ case SC_CAT_DELETE_TABS:
+ {
+ pCurrentAction->aBigRange.Set(nInt32Min, nInt32Min, nPosition,
+ nInt32Max, nInt32Max, nPosition + nCount - 1);
+ }
+ break;
+ }
+}
+
+void ScXMLChangeTrackingImportHelper::AddDeleted(const sal_uInt32 nID)
+{
+ ScMyDeleted* pDeleted = new ScMyDeleted();
+ pDeleted->nID = nID;
+ pCurrentAction->aDeletedList.push_front(pDeleted);
+}
+
+void ScXMLChangeTrackingImportHelper::AddDeleted(const sal_uInt32 nID, ScMyCellInfo* pCellInfo)
+{
+ ScMyDeleted* pDeleted = new ScMyDeleted();
+ pDeleted->nID = nID;
+ pDeleted->pCellInfo = pCellInfo;
+ pCurrentAction->aDeletedList.push_front(pDeleted);
+}
+
+void ScXMLChangeTrackingImportHelper::SetMultiSpanned(const sal_Int16 nTempMultiSpanned)
+{
+ if (nTempMultiSpanned)
+ {
+ DBG_ASSERT(((pCurrentAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pCurrentAction->nActionType == SC_CAT_DELETE_ROWS)), "wrong action type");
+ nMultiSpanned = nTempMultiSpanned;
+ nMultiSpannedSlaveCount = 0;
+ }
+}
+
+void ScXMLChangeTrackingImportHelper::SetInsertionCutOff(const sal_uInt32 nID, const sal_Int32 nPosition)
+{
+ if ((pCurrentAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pCurrentAction->nActionType == SC_CAT_DELETE_ROWS))
+ {
+ static_cast<ScMyDelAction*>(pCurrentAction)->pInsCutOff = new ScMyInsertionCutOff(nID, nPosition);
+ }
+ else
+ DBG_ERROR("wrong action type");
+}
+
+void ScXMLChangeTrackingImportHelper::AddMoveCutOff(const sal_uInt32 nID, const sal_Int32 nStartPosition, const sal_Int32 nEndPosition)
+{
+ if ((pCurrentAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pCurrentAction->nActionType == SC_CAT_DELETE_ROWS))
+ {
+ static_cast<ScMyDelAction*>(pCurrentAction)->aMoveCutOffs.push_front(ScMyMoveCutOff(nID, nStartPosition, nEndPosition));
+ }
+ else
+ DBG_ERROR("wrong action type");
+}
+
+void ScXMLChangeTrackingImportHelper::SetMoveRanges(const ScBigRange& aSourceRange, const ScBigRange& aTargetRange)
+{
+ if (pCurrentAction->nActionType == SC_CAT_MOVE)
+ {
+ static_cast<ScMyMoveAction*>(pCurrentAction)->pMoveRanges = new ScMyMoveRanges(aSourceRange, aTargetRange);
+ }
+ else
+ DBG_ERROR("wrong action type");
+}
+
+void ScXMLChangeTrackingImportHelper::GetMultiSpannedRange()
+{
+ if ((pCurrentAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pCurrentAction->nActionType == SC_CAT_DELETE_ROWS))
+ {
+ if (nMultiSpannedSlaveCount)
+ {
+ static_cast<ScMyDelAction*>(pCurrentAction)->nD = nMultiSpannedSlaveCount;
+ }
+ nMultiSpannedSlaveCount++;
+ if (nMultiSpannedSlaveCount >= nMultiSpanned)
+ {
+ nMultiSpanned = 0;
+ nMultiSpannedSlaveCount = 0;
+ }
+ }
+ else
+ DBG_ERROR("wrong action type");
+}
+
+void ScXMLChangeTrackingImportHelper::AddGenerated(ScMyCellInfo* pCellInfo, const ScBigRange& aBigRange)
+{
+ ScMyGenerated* pGenerated = new ScMyGenerated(pCellInfo, aBigRange);
+ if (pCurrentAction->nActionType == SC_CAT_MOVE)
+ {
+ static_cast<ScMyMoveAction*>(pCurrentAction)->aGeneratedList.push_back(pGenerated);
+ }
+ else if ((pCurrentAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pCurrentAction->nActionType == SC_CAT_DELETE_ROWS))
+ {
+ static_cast<ScMyDelAction*>(pCurrentAction)->aGeneratedList.push_back(pGenerated);
+ }
+ else
+ DBG_ERROR("try to insert a generated action to a wrong action");
+}
+
+void ScXMLChangeTrackingImportHelper::EndChangeAction()
+{
+ if ((pCurrentAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pCurrentAction->nActionType == SC_CAT_DELETE_ROWS))
+ GetMultiSpannedRange();
+ if (pCurrentAction && pCurrentAction->nActionNumber > 0)
+ aActions.push_back(pCurrentAction);
+ else
+ DBG_ERROR("no current action");
+ pCurrentAction = NULL;
+}
+
+void ScXMLChangeTrackingImportHelper::ConvertInfo(const ScMyActionInfo& aInfo, String& rUser, DateTime& aDateTime)
+{
+ Date aDate(aInfo.aDateTime.Day, aInfo.aDateTime.Month, aInfo.aDateTime.Year);
+ Time aTime(aInfo.aDateTime.Hours, aInfo.aDateTime.Minutes, aInfo.aDateTime.Seconds, aInfo.aDateTime.HundredthSeconds);
+ aDateTime.SetDate( aDate.GetDate() );
+ aDateTime.SetTime( aTime.GetTime() );
+
+ // #97286# old files didn't store 100th seconds, enable again
+ if ( aInfo.aDateTime.HundredthSeconds )
+ pTrack->SetTime100thSeconds( TRUE );
+
+ StrData aStrData( aInfo.sUser );
+ USHORT nPos;
+ if ( pTrack->GetUserCollection().Search( &aStrData, nPos ) )
+ {
+ const StrData* pUser = static_cast<const StrData*>( pTrack->GetUserCollection().At( nPos ) );
+ if ( pUser )
+ rUser = pUser->GetString();
+ else
+ rUser = aInfo.sUser; // shouldn't happen
+ }
+ else
+ rUser = aInfo.sUser; // shouldn't happen
+}
+
+ScChangeAction* ScXMLChangeTrackingImportHelper::CreateInsertAction(ScMyInsAction* pAction)
+{
+ DateTime aDateTime( Date(0), Time(0) );
+ String aUser;
+ ConvertInfo(pAction->aInfo, aUser, aDateTime);
+
+ String sComment (pAction->aInfo.sComment);
+
+ ScChangeAction* pNewAction = new ScChangeActionIns(pAction->nActionNumber, pAction->nActionState, pAction->nRejectingNumber,
+ pAction->aBigRange, aUser, aDateTime, sComment, pAction->nActionType);
+ return pNewAction;
+}
+
+ScChangeAction* ScXMLChangeTrackingImportHelper::CreateDeleteAction(ScMyDelAction* pAction)
+{
+ DateTime aDateTime( Date(0), Time(0) );
+ String aUser;
+ ConvertInfo(pAction->aInfo, aUser, aDateTime);
+
+ String sComment (pAction->aInfo.sComment);
+
+ ScChangeAction* pNewAction = new ScChangeActionDel(pAction->nActionNumber, pAction->nActionState, pAction->nRejectingNumber,
+ pAction->aBigRange, aUser, aDateTime, sComment, pAction->nActionType, pAction->nD, pTrack);
+ return pNewAction;
+}
+
+ScChangeAction* ScXMLChangeTrackingImportHelper::CreateMoveAction(ScMyMoveAction* pAction)
+{
+ DBG_ASSERT(pAction->pMoveRanges, "no move ranges");
+ if (pAction->pMoveRanges)
+ {
+ DateTime aDateTime( Date(0), Time(0) );
+ String aUser;
+ ConvertInfo(pAction->aInfo, aUser, aDateTime);
+
+ String sComment (pAction->aInfo.sComment);
+
+ ScChangeAction* pNewAction = new ScChangeActionMove(pAction->nActionNumber, pAction->nActionState, pAction->nRejectingNumber,
+ pAction->pMoveRanges->aTargetRange, aUser, aDateTime, sComment, pAction->pMoveRanges->aSourceRange , pTrack);
+ return pNewAction;
+ }
+ return NULL;
+}
+
+ScChangeAction* ScXMLChangeTrackingImportHelper::CreateRejectionAction(ScMyRejAction* pAction)
+{
+ DateTime aDateTime( Date(0), Time(0) );
+ String aUser;
+ ConvertInfo(pAction->aInfo, aUser, aDateTime);
+
+ String sComment (pAction->aInfo.sComment);
+
+ ScChangeAction* pNewAction = new ScChangeActionReject(pAction->nActionNumber, pAction->nActionState, pAction->nRejectingNumber,
+ pAction->aBigRange, aUser, aDateTime, sComment);
+ return pNewAction;
+}
+
+ScChangeAction* ScXMLChangeTrackingImportHelper::CreateContentAction(ScMyContentAction* pAction)
+{
+ ScBaseCell* pCell = NULL;
+ if (pAction->pCellInfo)
+ pCell = pAction->pCellInfo->CreateCell(pDoc);
+
+ DateTime aDateTime( Date(0), Time(0) );
+ String aUser;
+ ConvertInfo(pAction->aInfo, aUser, aDateTime);
+
+ String sComment (pAction->aInfo.sComment);
+
+ ScChangeAction* pNewAction = new ScChangeActionContent(pAction->nActionNumber, pAction->nActionState, pAction->nRejectingNumber,
+ pAction->aBigRange, aUser, aDateTime, sComment, pCell, pDoc, pAction->pCellInfo->sResult);
+ return pNewAction;
+}
+
+void ScXMLChangeTrackingImportHelper::CreateGeneratedActions(ScMyGeneratedList& rList)
+{
+ if (!rList.empty())
+ {
+ ScMyGeneratedList::iterator aItr = rList.begin();
+ while (aItr != rList.end())
+ {
+ if (((*aItr)->nID == 0))
+ {
+ ScBaseCell* pCell = NULL;
+ if ((*aItr)->pCellInfo)
+ pCell = (*aItr)->pCellInfo->CreateCell(pDoc);
+
+ if (pCell)
+ {
+ (*aItr)->nID = pTrack->AddLoadedGenerated(pCell, (*aItr)->aBigRange );
+ DBG_ASSERT((*aItr)->nID, "could not insert generated action");
+ }
+ }
+ aItr++;
+ }
+ }
+}
+
+void ScXMLChangeTrackingImportHelper::SetDeletionDependences(ScMyDelAction* pAction, ScChangeActionDel* pDelAct)
+{
+ if (!pAction->aGeneratedList.empty())
+ {
+ DBG_ASSERT(((pAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pAction->nActionType == SC_CAT_DELETE_ROWS) ||
+ (pAction->nActionType == SC_CAT_DELETE_TABS)), "wrong action type");
+ if (pDelAct)
+ {
+ ScMyGeneratedList::iterator aItr = pAction->aGeneratedList.begin();
+ while (aItr != pAction->aGeneratedList.end())
+ {
+ DBG_ASSERT((*aItr)->nID, "a not inserted generated action");
+ pDelAct->SetDeletedInThis((*aItr)->nID, pTrack);
+ if (*aItr)
+ delete *aItr;
+ aItr = pAction->aGeneratedList.erase(aItr);
+ }
+ }
+ }
+ if (pAction->pInsCutOff)
+ {
+ DBG_ASSERT(((pAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pAction->nActionType == SC_CAT_DELETE_ROWS) ||
+ (pAction->nActionType == SC_CAT_DELETE_TABS)), "wrong action type");
+ ScChangeAction* pChangeAction = pTrack->GetAction(pAction->pInsCutOff->nID);
+ if (pChangeAction && pChangeAction->IsInsertType())
+ {
+ ScChangeActionIns* pInsAction = static_cast<ScChangeActionIns*>(pChangeAction);
+ if (pInsAction && pDelAct)
+ pDelAct->SetCutOffInsert(pInsAction, static_cast<sal_Int16>(pAction->pInsCutOff->nPosition));
+ }
+ else
+ DBG_ERROR("no cut off insert action");
+ }
+ if (!pAction->aMoveCutOffs.empty())
+ {
+ DBG_ASSERT(((pAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pAction->nActionType == SC_CAT_DELETE_ROWS) ||
+ (pAction->nActionType == SC_CAT_DELETE_TABS)), "wrong action type");
+ ScMyMoveCutOffs::iterator aItr = pAction->aMoveCutOffs.begin();
+ while(aItr != pAction->aMoveCutOffs.end())
+ {
+ ScChangeAction* pChangeAction = pTrack->GetAction(aItr->nID);
+ if (pChangeAction && (pChangeAction->GetType() == SC_CAT_MOVE))
+ {
+ ScChangeActionMove* pMoveAction = static_cast<ScChangeActionMove*>(pChangeAction);
+ if (pMoveAction && pDelAct)
+ pDelAct->AddCutOffMove(pMoveAction, static_cast<sal_Int16>(aItr->nStartPosition),
+ static_cast<sal_Int16>(aItr->nEndPosition));
+ }
+ else
+ DBG_ERROR("no cut off move action");
+ aItr = pAction->aMoveCutOffs.erase(aItr);
+ }
+ }
+}
+
+void ScXMLChangeTrackingImportHelper::SetMovementDependences(ScMyMoveAction* pAction, ScChangeActionMove* pMoveAct)
+{
+ if (!pAction->aGeneratedList.empty())
+ {
+ if (pAction->nActionType == SC_CAT_MOVE)
+ {
+ if (pMoveAct)
+ {
+ ScMyGeneratedList::iterator aItr = pAction->aGeneratedList.begin();
+ while (aItr != pAction->aGeneratedList.end())
+ {
+ DBG_ASSERT((*aItr)->nID, "a not inserted generated action");
+ pMoveAct->SetDeletedInThis((*aItr)->nID, pTrack);
+ if (*aItr)
+ delete *aItr;
+ aItr = pAction->aGeneratedList.erase(aItr);
+ }
+ }
+ }
+ }
+}
+
+void ScXMLChangeTrackingImportHelper::SetContentDependences(ScMyContentAction* pAction, ScChangeActionContent* pActContent)
+{
+ if (pAction->nPreviousAction)
+ {
+ DBG_ASSERT(pAction->nActionType == SC_CAT_CONTENT, "wrong action type");
+ ScChangeAction* pPrevAct = pTrack->GetAction(pAction->nPreviousAction);
+ if (pPrevAct)
+ {
+ ScChangeActionContent* pPrevActContent = static_cast<ScChangeActionContent*>(pPrevAct);
+ if (pPrevActContent && pActContent)
+ {
+ pActContent->SetPrevContent(pPrevActContent);
+ pPrevActContent->SetNextContent(pActContent);
+ const ScBaseCell* pOldCell = pActContent->GetOldCell();
+ if (pOldCell)
+ {
+ ScBaseCell* pNewCell = pOldCell->Clone(pDoc);
+ if (pNewCell)
+ pPrevActContent->SetNewCell(pNewCell, pDoc);
+ }
+ }
+ }
+ }
+}
+
+void ScXMLChangeTrackingImportHelper::SetDependences(ScMyBaseAction* pAction)
+{
+ ScChangeAction* pAct = pTrack->GetAction(pAction->nActionNumber);
+ if (pAct)
+ {
+ if (!pAction->aDependences.empty())
+ {
+ ScMyDependences::iterator aItr = pAction->aDependences.begin();
+ while(aItr != pAction->aDependences.end())
+ {
+ pAct->AddDependent(*aItr, pTrack);
+ aItr = pAction->aDependences.erase(aItr);
+ }
+ }
+ if (!pAction->aDeletedList.empty())
+ {
+ ScMyDeletedList::iterator aItr = pAction->aDeletedList.begin();
+ while(aItr != pAction->aDeletedList.end())
+ {
+ pAct->SetDeletedInThis((*aItr)->nID, pTrack);
+ ScChangeAction* pDeletedAct = pTrack->GetAction((*aItr)->nID);
+ if ((pDeletedAct->GetType() == SC_CAT_CONTENT) && (*aItr)->pCellInfo)
+ {
+ ScChangeActionContent* pContentAct = static_cast<ScChangeActionContent*>(pDeletedAct);
+ if (pContentAct && (*aItr)->pCellInfo)
+ {
+ ScBaseCell* pCell = (*aItr)->pCellInfo->CreateCell(pDoc);
+ if (!ScBaseCell::CellEqual(pCell, pContentAct->GetNewCell()))
+ pContentAct->SetNewCell(pCell, pDoc);
+ }
+ }
+ if (*aItr)
+ delete *aItr;
+ aItr = pAction->aDeletedList.erase(aItr);
+ }
+ }
+ if ((pAction->nActionType == SC_CAT_DELETE_COLS) ||
+ (pAction->nActionType == SC_CAT_DELETE_ROWS))
+ SetDeletionDependences(static_cast<ScMyDelAction*>(pAction), static_cast<ScChangeActionDel*>(pAct));
+ else if (pAction->nActionType == SC_CAT_MOVE)
+ SetMovementDependences(static_cast<ScMyMoveAction*>(pAction), static_cast<ScChangeActionMove*>(pAct));
+ else if (pAction->nActionType == SC_CAT_CONTENT)
+ SetContentDependences(static_cast<ScMyContentAction*>(pAction), static_cast<ScChangeActionContent*>(pAct));
+ }
+ else
+ DBG_ERROR("could not find the action");
+}
+
+void ScXMLChangeTrackingImportHelper::SetNewCell(ScMyContentAction* pAction)
+{
+ ScChangeAction* pChangeAction = pTrack->GetAction(pAction->nActionNumber);
+ if (pChangeAction)
+ {
+ ScChangeActionContent* pChangeActionContent = static_cast<ScChangeActionContent*>(pChangeAction);
+ if (pChangeActionContent)
+ {
+ if (pChangeActionContent->IsTopContent() && !pChangeActionContent->IsDeletedIn())
+ {
+ sal_Int32 nCol, nRow, nTab, nCol2, nRow2, nTab2;
+ pAction->aBigRange.GetVars(nCol, nRow, nTab, nCol2, nRow2, nTab2);
+ if ((nCol >= 0) && (nCol <= MAXCOL) &&
+ (nRow >= 0) && (nRow <= MAXROW) &&
+ (nTab >= 0) && (nTab <= MAXTAB))
+ {
+ ScAddress aAddress (static_cast<sal_uInt16>(nCol),
+ static_cast<sal_uInt16>(nRow),
+ static_cast<sal_uInt16>(nTab));
+ ScBaseCell* pCell = pDoc->GetCell(aAddress);
+ if (pCell)
+ {
+ ScBaseCell* pNewCell = NULL;
+ if (pCell->GetCellType() != CELLTYPE_FORMULA)
+ pNewCell = pCell->Clone(pDoc);
+ else
+ {
+ sal_uInt8 nMatrixFlag = static_cast<ScFormulaCell*>(pCell)->GetMatrixFlag();
+ String sFormula;
+ static_cast<ScFormulaCell*>(pCell)->GetFormula(sFormula);
+ ::rtl::OUString sOUFormula(sFormula);
+ ::rtl::OUString sOUFormula2(sOUFormula.copy(2, sOUFormula.getLength() - 3));
+ String sFormula2(sOUFormula2);
+ pNewCell = new ScFormulaCell(pDoc, aAddress, sFormula2, nMatrixFlag);
+ if (pNewCell)
+ {
+ if (nMatrixFlag == MM_FORMULA)
+ {
+ sal_uInt16 nCols, nRows;
+ static_cast<ScFormulaCell*>(pCell)->GetMatColsRows(nCols, nRows);
+ static_cast<ScFormulaCell*>(pNewCell)->SetMatColsRows(nCols, nRows);
+ }
+ static_cast<ScFormulaCell*>(pNewCell)->SetInChangeTrack(sal_True);
+ }
+ }
+ pChangeActionContent->SetNewCell(pNewCell, pDoc);
+ }
+ }
+ else
+ DBG_ERROR("wrong cell position");
+ }
+ }
+ }
+}
+
+void ScXMLChangeTrackingImportHelper::CreateChangeTrack(ScDocument* pTempDoc)
+{
+ pDoc = pTempDoc;
+ if (pDoc)
+ {
+ pTrack = new ScChangeTrack(pDoc, aUsers);
+ // #97286# old files didn't store 100th seconds, disable until encountered
+ pTrack->SetTime100thSeconds( FALSE );
+
+ ScMyActions::iterator aItr = aActions.begin();
+ while (aItr != aActions.end())
+ {
+ ScChangeAction* pAction = NULL;
+
+ switch ((*aItr)->nActionType)
+ {
+ case SC_CAT_INSERT_COLS:
+ case SC_CAT_INSERT_ROWS:
+ case SC_CAT_INSERT_TABS:
+ {
+ pAction = CreateInsertAction(static_cast<ScMyInsAction*>(*aItr));
+ }
+ break;
+ case SC_CAT_DELETE_COLS:
+ case SC_CAT_DELETE_ROWS:
+ case SC_CAT_DELETE_TABS:
+ {
+ ScMyDelAction* pDelAct = static_cast<ScMyDelAction*>(*aItr);
+ pAction = CreateDeleteAction(pDelAct);
+ CreateGeneratedActions(pDelAct->aGeneratedList);
+ }
+ break;
+ case SC_CAT_MOVE:
+ {
+ ScMyMoveAction* pMovAct = static_cast<ScMyMoveAction*>(*aItr);
+ pAction = CreateMoveAction(pMovAct);
+ CreateGeneratedActions(pMovAct->aGeneratedList);
+ }
+ break;
+ case SC_CAT_CONTENT:
+ {
+ pAction = CreateContentAction(static_cast<ScMyContentAction*>(*aItr));
+ }
+ break;
+ case SC_CAT_REJECT:
+ {
+ pAction = CreateRejectionAction(static_cast<ScMyRejAction*>(*aItr));
+ }
+ break;
+ }
+
+ if (pAction)
+ pTrack->AppendLoaded(pAction);
+ else
+ DBG_ERROR("no action");
+
+ aItr++;
+ }
+ if (pTrack->GetLast())
+ pTrack->SetActionMax(pTrack->GetLast()->GetActionNumber());
+
+ aItr = aActions.begin();
+ while (aItr != aActions.end())
+ {
+ SetDependences(*aItr);
+
+ if ((*aItr)->nActionType == SC_CAT_CONTENT)
+ aItr++;
+ else
+ {
+ if (*aItr)
+ delete (*aItr);
+ aItr = aActions.erase(aItr);
+ }
+ }
+
+ aItr = aActions.begin();
+ while (aItr != aActions.end())
+ {
+ DBG_ASSERT((*aItr)->nActionType == SC_CAT_CONTENT, "wrong action type");
+ SetNewCell(static_cast<ScMyContentAction*>(*aItr));
+ if (*aItr)
+ delete (*aItr);
+ aItr = aActions.erase(aItr);
+ }
+ if (aProtect.getLength())
+ pTrack->SetProtection(aProtect);
+
+ if ( pTrack->GetLast() )
+ pTrack->SetLastSavedActionNumber(pTrack->GetLast()->GetActionNumber());
+
+ pDoc->SetChangeTrack(pTrack);
+ }
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */