/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" // INCLUDE --------------------------------------------------------------- #include "XMLStylesImportHelper.hxx" #include "xmlimprt.hxx" #include #include using namespace com::sun::star; void ScMyStyleNumberFormats::AddStyleNumberFormat(const rtl::OUString& rStyleName, const sal_Int32 nNumberFormat) { aSet.insert(ScMyStyleNumberFormat(rStyleName, nNumberFormat)); } sal_Int32 ScMyStyleNumberFormats::GetStyleNumberFormat(const rtl::OUString& rStyleName) { ScMyStyleNumberFormat aStyleNumberFormat(rStyleName); ScMyStyleNumberFormatSet::iterator aItr(aSet.find(aStyleNumberFormat)); if (aItr == aSet.end()) return -1; else return aItr->nNumberFormat; } ScMyStyleRanges::ScMyStyleRanges() : pTextList(NULL), pNumberList(NULL), pTimeList(NULL), pDateTimeList(NULL), pPercentList(NULL), pLogicalList(NULL), pUndefinedList(NULL), pCurrencyList(NULL) { } ScMyStyleRanges::~ScMyStyleRanges() { if (pTextList) delete pTextList; if (pNumberList) delete pNumberList; if (pTimeList) delete pTimeList; if (pDateTimeList) delete pDateTimeList; if (pPercentList) delete pPercentList; if (pLogicalList) delete pLogicalList; if (pUndefinedList) delete pUndefinedList; if (pCurrencyList) delete pCurrencyList; } void ScMyStyleRanges::AddRange(const ScRange& rRange, ScRangeList* pList, const rtl::OUString* pStyleName, const sal_Int16 nType, ScXMLImport& rImport, const sal_uInt32 nMaxRanges) { pList->Join(rRange); DBG_ASSERT(nMaxRanges > 0, "MaxRanges to less"); if (pList->Count() > nMaxRanges) { sal_Int32 nCount(pList->Count()); ScRange* pRange(NULL); for (sal_Int32 i = 0; i < nCount; ++i) { pRange = pList->GetObject(i); if (pRange && (pRange->aEnd.Row() + 1 < rRange.aStart.Row())) { rImport.SetStyleToRange(*pRange, pStyleName, nType, NULL); delete pRange; pRange = NULL; pList->Remove(i); } } } } void ScMyStyleRanges::AddCurrencyRange(const ScRange& rRange, ScRangeListRef xList, const rtl::OUString* pStyleName, const rtl::OUString* pCurrency, ScXMLImport& rImport, const sal_uInt32 nMaxRanges) { xList->Join(rRange); DBG_ASSERT(nMaxRanges > 0, "MaxRanges to less"); if (xList->Count() > nMaxRanges) { sal_Int32 nCount(xList->Count()); ScRange* pRange(NULL); for (sal_Int32 i = 0; i < nCount; ++i) { pRange = xList->GetObject(i); if (pRange && (pRange->aEnd.Row() + 1 < rRange.aStart.Row())) { rImport.SetStyleToRange(*pRange, pStyleName, util::NumberFormat::CURRENCY, pCurrency); delete pRange; pRange = NULL; xList->Remove(i); } } } } void ScMyStyleRanges::AddRange(const ScRange& rRange, const rtl::OUString* pStyleName, const sal_Int16 nType, ScXMLImport& rImport, const sal_uInt32 nMaxRanges) { switch (nType) { case util::NumberFormat::NUMBER: { if (!pNumberList) pNumberList = new ScRangeList(); AddRange(rRange, pNumberList, pStyleName, nType, rImport, nMaxRanges); } break; case util::NumberFormat::TEXT: { if (!pTextList) pTextList = new ScRangeList(); AddRange(rRange, pTextList, pStyleName, nType, rImport, nMaxRanges); } break; case util::NumberFormat::TIME: { if (!pTimeList) pTimeList = new ScRangeList(); AddRange(rRange, pTimeList, pStyleName, nType, rImport, nMaxRanges); } break; case util::NumberFormat::DATETIME: { if (!pDateTimeList) pDateTimeList = new ScRangeList(); AddRange(rRange, pDateTimeList, pStyleName, nType, rImport, nMaxRanges); } break; case util::NumberFormat::PERCENT: { if (!pPercentList) pPercentList = new ScRangeList(); AddRange(rRange, pPercentList, pStyleName, nType, rImport, nMaxRanges); } break; case util::NumberFormat::LOGICAL: { if (!pLogicalList) pLogicalList = new ScRangeList(); AddRange(rRange, pLogicalList, pStyleName, nType, rImport, nMaxRanges); } break; case util::NumberFormat::UNDEFINED: { if (!pUndefinedList) pUndefinedList = new ScRangeList(); AddRange(rRange, pUndefinedList, pStyleName, nType, rImport, nMaxRanges); } break; default: { DBG_ERROR("wrong type"); } break; } } void ScMyStyleRanges::AddCurrencyRange(const ScRange& rRange, const rtl::OUString* pStyleName, const rtl::OUString* pCurrency, ScXMLImport& rImport, const sal_uInt32 nMaxRanges) { if (!pCurrencyList) pCurrencyList = new ScMyCurrencyStylesSet(); ScMyCurrencyStyle aStyle; if (pCurrency) aStyle.sCurrency = *pCurrency; ScMyCurrencyStylesSet::iterator aItr(pCurrencyList->find(aStyle)); if (aItr == pCurrencyList->end()) { std::pair aPair(pCurrencyList->insert(aStyle)); if (aPair.second) { aItr = aPair.first; AddCurrencyRange(rRange, aItr->xRanges, pStyleName, pCurrency, rImport, nMaxRanges); } } else aItr->xRanges->Join(rRange); } void ScMyStyleRanges::InsertColRow(const ScRange& rRange, const SCsCOL nDx, const SCsROW nDy, const SCsTAB nDz, ScDocument* pDoc) { UpdateRefMode aRefMode(URM_INSDEL); if (pNumberList) pNumberList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz); if (pTextList) pTextList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz); if (pTimeList) pTimeList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz); if (pDateTimeList) pDateTimeList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz); if (pPercentList) pPercentList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz); if (pLogicalList) pLogicalList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz); if (pUndefinedList) pUndefinedList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz); if (pCurrencyList) { ScMyCurrencyStylesSet::iterator aItr(pCurrencyList->begin()); ScMyCurrencyStylesSet::iterator aEndItr(pCurrencyList->end()); while (aItr != aEndItr) { aItr->xRanges->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz); ++aItr; } } } void ScMyStyleRanges::InsertRow(const sal_Int32 nRow, const sal_Int32 nTab, ScDocument* pDoc) { InsertColRow(ScRange(0, static_cast(nRow), static_cast(nTab), MAXCOL, MAXROW, static_cast(nTab)), 0, 1, 0, pDoc); } void ScMyStyleRanges::InsertCol(const sal_Int32 nCol, const sal_Int32 nTab, ScDocument* pDoc) { InsertColRow(ScRange(static_cast(nCol), 0, static_cast(nTab), MAXCOL, MAXROW, static_cast(nTab)), 1, 0, 0, pDoc); } void ScMyStyleRanges::SetStylesToRanges(ScRangeList* pList, const rtl::OUString* pStyleName, const sal_Int16 nCellType, const rtl::OUString* pCurrency, ScXMLImport& rImport) { sal_Int32 nCount(pList->Count()); for (sal_Int32 i = 0; i < nCount; ++i) rImport.SetStyleToRange(*pList->GetObject(i), pStyleName, nCellType, pCurrency); } void ScMyStyleRanges::SetStylesToRanges(ScRangeListRef xList, const rtl::OUString* pStyleName, const sal_Int16 nCellType, const rtl::OUString* pCurrency, ScXMLImport& rImport) { sal_Int32 nCount(xList->Count()); for (sal_Int32 i = 0; i < nCount; ++i) rImport.SetStyleToRange(*xList->GetObject(i), pStyleName, nCellType, pCurrency); } void ScMyStyleRanges::SetStylesToRanges(const rtl::OUString* pStyleName, ScXMLImport& rImport) { if (pNumberList) SetStylesToRanges(pNumberList, pStyleName, util::NumberFormat::NUMBER, NULL, rImport); if (pTextList) SetStylesToRanges(pTextList, pStyleName, util::NumberFormat::TEXT, NULL, rImport); if (pTimeList) SetStylesToRanges(pTimeList, pStyleName, util::NumberFormat::TIME, NULL, rImport); if (pDateTimeList) SetStylesToRanges(pDateTimeList, pStyleName, util::NumberFormat::DATETIME, NULL, rImport); if (pPercentList) SetStylesToRanges(pPercentList, pStyleName, util::NumberFormat::PERCENT, NULL, rImport); if (pLogicalList) SetStylesToRanges(pLogicalList, pStyleName, util::NumberFormat::LOGICAL, NULL, rImport); if (pUndefinedList) SetStylesToRanges(pUndefinedList, pStyleName, util::NumberFormat::UNDEFINED, NULL, rImport); if (pCurrencyList) { ScMyCurrencyStylesSet::iterator aItr(pCurrencyList->begin()); ScMyCurrencyStylesSet::iterator aEndItr(pCurrencyList->end()); while (aItr != aEndItr) { SetStylesToRanges(aItr->xRanges, pStyleName, util::NumberFormat::CURRENCY, &aItr->sCurrency, rImport); ++aItr; } } } //---------------------------------------------------------------------------- ScMyStylesImportHelper::ScMyStylesImportHelper(ScXMLImport& rTempImport) : aRowDefaultStyle(aCellStyles.end()), rImport(rTempImport), pStyleName(NULL), pPrevStyleName(NULL), pCurrency(NULL), pPrevCurrency(NULL), nMaxRanges(0), bPrevRangeAdded(sal_True) { } ScMyStylesImportHelper::~ScMyStylesImportHelper() { if (pPrevStyleName) delete pPrevStyleName; if (pPrevCurrency) delete pPrevCurrency; if (pStyleName) delete pStyleName; if (pCurrency) delete pCurrency; } void ScMyStylesImportHelper::ResetAttributes() { if (pPrevStyleName) delete pPrevStyleName; if (pPrevCurrency) delete pPrevCurrency; pPrevStyleName = pStyleName; pPrevCurrency = pCurrency; nPrevCellType = nCellType; pStyleName = NULL; pCurrency = NULL; nCellType = 0; } ScMyStylesSet::iterator ScMyStylesImportHelper::GetIterator(const rtl::OUString* pStyleNameP) { ScMyStyle aStyle; if (pStyleNameP) aStyle.sStyleName = *pStyleNameP; else { DBG_ERROR("here is no stylename given"); } ScMyStylesSet::iterator aItr(aCellStyles.find(aStyle)); if (aItr == aCellStyles.end()) { std::pair aPair(aCellStyles.insert(aStyle)); if (aPair.second) aItr = aPair.first; else { DBG_ERROR("not possible to insert style"); return aCellStyles.end(); } } return aItr; } void ScMyStylesImportHelper::AddDefaultRange(const ScRange& rRange) { DBG_ASSERT(aRowDefaultStyle != aCellStyles.end(), "no row default style"); if (!aRowDefaultStyle->sStyleName.getLength()) { SCCOL nStartCol(rRange.aStart.Col()); SCCOL nEndCol(rRange.aEnd.Col()); if (aColDefaultStyles.size() > sal::static_int_cast(nStartCol)) { ScMyStylesSet::iterator aPrevItr(aColDefaultStyles[nStartCol]); DBG_ASSERT(aColDefaultStyles.size() > sal::static_int_cast(nEndCol), "to much columns"); for (SCCOL i = nStartCol + 1; (i <= nEndCol) && (i < sal::static_int_cast(aColDefaultStyles.size())); ++i) { if (aPrevItr != aColDefaultStyles[i]) { DBG_ASSERT(aPrevItr != aCellStyles.end(), "no column default style"); ScRange aRange(rRange); aRange.aStart.SetCol(nStartCol); aRange.aEnd.SetCol(i - 1); if (pPrevStyleName) delete pPrevStyleName; pPrevStyleName = new rtl::OUString(aPrevItr->sStyleName); AddSingleRange(aRange); nStartCol = i; aPrevItr = aColDefaultStyles[i]; } } if (aPrevItr != aCellStyles.end()) { ScRange aRange(rRange); aRange.aStart.SetCol(nStartCol); if (pPrevStyleName) delete pPrevStyleName; pPrevStyleName = new rtl::OUString(aPrevItr->sStyleName); AddSingleRange(aRange); } else { DBG_ERRORFILE("no column default style"); } } else { DBG_ERRORFILE("to much columns"); } } else { if (pPrevStyleName) delete pPrevStyleName; pPrevStyleName = new rtl::OUString(aRowDefaultStyle->sStyleName); AddSingleRange(rRange); } } void ScMyStylesImportHelper::AddSingleRange(const ScRange& rRange) { if (nMaxRanges == 0) nMaxRanges = aColDefaultStyles.size(); ScMyStylesSet::iterator aItr(GetIterator(pPrevStyleName)); if (aItr != aCellStyles.end()) { if (nPrevCellType != util::NumberFormat::CURRENCY) aItr->xRanges->AddRange(rRange, pPrevStyleName, nPrevCellType, rImport, nMaxRanges); else aItr->xRanges->AddCurrencyRange(rRange, pPrevStyleName, pPrevCurrency, rImport, nMaxRanges); } } void ScMyStylesImportHelper::AddRange() { if (pPrevStyleName && pPrevStyleName->getLength()) AddSingleRange(aPrevRange); else AddDefaultRange(aPrevRange); ResetAttributes(); } void ScMyStylesImportHelper::AddColumnStyle(const rtl::OUString& sStyleName, const sal_Int32 nColumn, const sal_Int32 nRepeat) { (void)nColumn; // avoid warning in product version DBG_ASSERT(static_cast(nColumn) == aColDefaultStyles.size(), "some columns are absent"); ScMyStylesSet::iterator aItr(GetIterator(&sStyleName)); DBG_ASSERT(aItr != aCellStyles.end(), "no column default style"); aColDefaultStyles.reserve(aColDefaultStyles.size() + nRepeat); for (sal_Int32 i = 0; i < nRepeat; ++i) aColDefaultStyles.push_back(aItr); } void ScMyStylesImportHelper::SetRowStyle(const rtl::OUString& sStyleName) { aRowDefaultStyle = GetIterator(&sStyleName); } void ScMyStylesImportHelper::SetAttributes(rtl::OUString* pStyleNameP, rtl::OUString* pCurrencyP, const sal_Int16 nCellTypeP) { if (this->pStyleName) delete this->pStyleName; if (this->pCurrency) delete this->pCurrency; this->pStyleName = pStyleNameP; this->pCurrency = pCurrencyP; this->nCellType = nCellTypeP; } void ScMyStylesImportHelper::AddRange(const ScRange& rRange) { if (!bPrevRangeAdded) { sal_Bool bAddRange(sal_False); if (nCellType == nPrevCellType && IsEqual(pStyleName, pPrevStyleName) && IsEqual(pCurrency, pPrevCurrency)) { if (rRange.aStart.Row() == aPrevRange.aStart.Row()) { if (rRange.aEnd.Row() == aPrevRange.aEnd.Row()) { DBG_ASSERT(aPrevRange.aEnd.Col() + 1 == rRange.aStart.Col(), "something wents wrong"); aPrevRange.aEnd.SetCol(rRange.aEnd.Col()); } else bAddRange = sal_True; } else { if (rRange.aStart.Col() == aPrevRange.aStart.Col() && rRange.aEnd.Col() == aPrevRange.aEnd.Col()) { DBG_ASSERT(aPrevRange.aEnd.Row() + 1 == rRange.aStart.Row(), "something wents wrong"); aPrevRange.aEnd.SetRow(rRange.aEnd.Row()); } else bAddRange = sal_True; } } else bAddRange = sal_True; if (bAddRange) { AddRange(); aPrevRange = rRange; } } else { aPrevRange = rRange; ResetAttributes(); bPrevRangeAdded = sal_False; } } void ScMyStylesImportHelper::AddCell(const com::sun::star::table::CellAddress& rAddress) { ScAddress aScAddress( static_cast(rAddress.Column), static_cast(rAddress.Row), rAddress.Sheet ); ScRange aScRange( aScAddress, aScAddress ); AddRange(aScRange); } void ScMyStylesImportHelper::InsertRow(const sal_Int32 nRow, const sal_Int32 nTab, ScDocument* pDoc) { rImport.LockSolarMutex(); ScMyStylesSet::iterator aItr(aCellStyles.begin()); ScMyStylesSet::iterator aEndItr(aCellStyles.end()); while (aItr != aEndItr) { aItr->xRanges->InsertRow(nRow, nTab, pDoc); ++aItr; } rImport.UnlockSolarMutex(); } void ScMyStylesImportHelper::InsertCol(const sal_Int32 nCol, const sal_Int32 nTab, ScDocument* pDoc) { rImport.LockSolarMutex(); ScMyStylesSet::iterator aItr(aCellStyles.begin()); ScMyStylesSet::iterator aEndItr(aCellStyles.end()); while (aItr != aEndItr) { aItr->xRanges->InsertCol(nCol, nTab, pDoc); ++aItr; } rImport.UnlockSolarMutex(); } void ScMyStylesImportHelper::EndTable() { if (!bPrevRangeAdded) { AddRange(); bPrevRangeAdded = sal_True; } nMaxRanges = 0; } void ScMyStylesImportHelper::SetStylesToRanges() { ScMyStylesSet::iterator aItr(aCellStyles.begin()); ScMyStylesSet::iterator aEndItr(aCellStyles.end()); while (aItr != aEndItr) { aItr->xRanges->SetStylesToRanges(&aItr->sStyleName, rImport); ++aItr; } aColDefaultStyles.clear(); aCellStyles.clear(); nMaxRanges = 0; }