summaryrefslogtreecommitdiff
path: root/sc/source/filter/xml/XMLStylesImportHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/xml/XMLStylesImportHelper.cxx')
-rw-r--r--sc/source/filter/xml/XMLStylesImportHelper.cxx587
1 files changed, 587 insertions, 0 deletions
diff --git a/sc/source/filter/xml/XMLStylesImportHelper.cxx b/sc/source/filter/xml/XMLStylesImportHelper.cxx
new file mode 100644
index 000000000000..492c7a63ee30
--- /dev/null
+++ b/sc/source/filter/xml/XMLStylesImportHelper.cxx
@@ -0,0 +1,587 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+
+
+// INCLUDE ---------------------------------------------------------------
+#include "XMLStylesImportHelper.hxx"
+#include "xmlimprt.hxx"
+#include <tools/debug.hxx>
+#include <com/sun/star/util/NumberFormat.hpp>
+
+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<ScMyCurrencyStylesSet::iterator, bool> 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<SCROW>(nRow), static_cast<SCTAB>(nTab),
+ MAXCOL, MAXROW, static_cast<SCTAB>(nTab)), 0, 1, 0, pDoc);
+}
+
+void ScMyStyleRanges::InsertCol(const sal_Int32 nCol, const sal_Int32 nTab, ScDocument* pDoc)
+{
+ InsertColRow(ScRange(static_cast<SCCOL>(nCol), 0, static_cast<SCTAB>(nTab),
+ MAXCOL, MAXROW, static_cast<SCTAB>(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<ScMyStylesSet::iterator, bool> 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<sal_uInt32>(nStartCol))
+ {
+ ScMyStylesSet::iterator aPrevItr(aColDefaultStyles[nStartCol]);
+ DBG_ASSERT(aColDefaultStyles.size() > sal::static_int_cast<sal_uInt32>(nEndCol), "to much columns");
+ for (SCCOL i = nStartCol + 1; (i <= nEndCol) && (i < sal::static_int_cast<SCCOL>(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<sal_uInt32>(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<SCCOL>(rAddress.Column), static_cast<SCROW>(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;
+}
+