summaryrefslogtreecommitdiff
path: root/sc/source/core/tool/doubleref.cxx
diff options
context:
space:
mode:
authorKohei Yoshida <kyoshida@novell.com>2009-09-09 10:57:16 -0400
committerKohei Yoshida <kyoshida@novell.com>2009-09-09 10:57:16 -0400
commitf371fca09ddff5d5d32a0dcec05931be04b1b8c9 (patch)
tree4d144cec484c37fc76793e626087c495699e7690 /sc/source/core/tool/doubleref.cxx
parent3db13d25ca7c79cbc53ecba722453571451b96e9 (diff)
#i102750# initial refactoring in an effort to support external references in DSUM, DGET etc. Not finished yet.
Diffstat (limited to 'sc/source/core/tool/doubleref.cxx')
-rw-r--r--sc/source/core/tool/doubleref.cxx236
1 files changed, 236 insertions, 0 deletions
diff --git a/sc/source/core/tool/doubleref.cxx b/sc/source/core/tool/doubleref.cxx
new file mode 100644
index 000000000000..2eb61c6be38e
--- /dev/null
+++ b/sc/source/core/tool/doubleref.cxx
@@ -0,0 +1,236 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: interpre.hxx,v $
+ * $Revision: 1.35.44.2 $
+ *
+ * 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 "doubleref.hxx"
+#include "cell.hxx"
+#include "global.hxx"
+#include "document.hxx"
+#include "queryparam.hxx"
+
+using ::rtl::OUString;
+
+// ============================================================================
+
+ScDoubleRefBase::ScDoubleRefBase(ScDocument* pDoc, RefType eType) :
+ mpDoc(pDoc), meType(eType)
+{
+}
+
+ScDoubleRefBase::~ScDoubleRefBase()
+{
+}
+
+ScDoubleRefBase::RefType ScDoubleRefBase::getType() const
+{
+ return meType;
+}
+
+ScDocument* ScDoubleRefBase::getDoc()
+{
+ return mpDoc;
+}
+
+// ============================================================================
+
+ScInternalDoubleRef::ScInternalDoubleRef(ScDocument* pDoc, const ScRange& rRange) :
+ ScDoubleRefBase(pDoc, INTERNAL), maRange(rRange)
+{
+}
+
+ScInternalDoubleRef::~ScInternalDoubleRef()
+{
+}
+
+const ScRange& ScInternalDoubleRef::getRange() const
+{
+ return maRange;
+}
+
+SCCOL ScInternalDoubleRef::getFirstFieldColumn()
+{
+ return getRange().aStart.Col();
+}
+
+SCCOL ScInternalDoubleRef::findFieldColumn(SCCOL nColIndex)
+{
+ const ScRange& rRange = getRange();
+ const ScAddress& s = rRange.aStart;
+ const ScAddress& e = rRange.aEnd;
+
+ SCCOL nDBCol1 = s.Col();
+ SCCOL nDBCol2 = e.Col();
+
+ if ( nColIndex <= 0 || nColIndex > (nDBCol2 - nDBCol1 + 1) )
+ return nDBCol1;
+
+ return Min(nDBCol2, static_cast<SCCOL>(nDBCol1 + nColIndex - 1));
+}
+
+sal_uInt16 ScInternalDoubleRef::getCellString(String& rStr, ScBaseCell* pCell)
+{
+ sal_uInt16 nErr = 0;
+ if (pCell)
+ {
+ SvNumberFormatter* pFormatter = getDoc()->GetFormatTable();
+ switch (pCell->GetCellType())
+ {
+ case CELLTYPE_STRING:
+ ((ScStringCell*) pCell)->GetString(rStr);
+ break;
+ case CELLTYPE_EDIT:
+ ((ScEditCell*) pCell)->GetString(rStr);
+ break;
+ case CELLTYPE_FORMULA:
+ {
+ ScFormulaCell* pFCell = (ScFormulaCell*) pCell;
+ nErr = pFCell->GetErrCode();
+ if (pFCell->IsValue())
+ {
+ double fVal = pFCell->GetValue();
+ ULONG nIndex = pFormatter->GetStandardFormat(
+ NUMBERFORMAT_NUMBER,
+ ScGlobal::eLnge);
+ pFormatter->GetInputLineString(fVal, nIndex, rStr);
+ }
+ else
+ pFCell->GetString(rStr);
+ }
+ break;
+ case CELLTYPE_VALUE:
+ {
+ double fVal = ((ScValueCell*) pCell)->GetValue();
+ ULONG nIndex = pFormatter->GetStandardFormat(
+ NUMBERFORMAT_NUMBER,
+ ScGlobal::eLnge);
+ pFormatter->GetInputLineString(fVal, nIndex, rStr);
+ }
+ break;
+ default:
+ rStr = ScGlobal::GetEmptyString();
+ break;
+ }
+ }
+ else
+ rStr = ScGlobal::GetEmptyString();
+
+ return nErr;
+}
+
+SCCOL ScInternalDoubleRef::findFieldColumn(const OUString& rStr, sal_uInt16& rErr)
+{
+ const ScRange& rRange = getRange();
+ const ScAddress& s = rRange.aStart;
+ const ScAddress& e = rRange.aEnd;
+
+ SCCOL nDBCol1 = s.Col();
+ SCROW nDBRow1 = s.Row();
+ SCTAB nDBTab1 = s.Tab();
+ SCCOL nDBCol2 = e.Col();
+
+ SCCOL nField = nDBCol1;
+ BOOL bFound = TRUE;
+
+ bFound = FALSE;
+ String aCellStr;
+ ScAddress aLook( nDBCol1, nDBRow1, nDBTab1 );
+ while (!bFound && (aLook.Col() <= nDBCol2))
+ {
+ ScBaseCell* pCell = getDoc()->GetCell( aLook );
+ rErr = getCellString( aCellStr, pCell );
+ bFound = ScGlobal::pTransliteration->isEqual(aCellStr, rStr);
+ if (!bFound)
+ aLook.IncCol();
+ }
+ nField = aLook.Col();
+
+ return bFound ? nField : -1;
+}
+
+void ScInternalDoubleRef::initQueryParam(ScQueryParam& rParam) const
+{
+ const ScAddress& s = maRange.aStart;
+ const ScAddress& e = maRange.aEnd;
+ rParam.nCol1 = s.Col();
+ rParam.nRow1 = s.Row();
+ rParam.nCol2 = e.Col();
+ rParam.nRow2 = e.Row();
+ rParam.nTab = s.Tab();
+ rParam.bHasHeader = TRUE;
+ rParam.bByRow = TRUE;
+ rParam.bInplace = TRUE;
+ rParam.bCaseSens = FALSE;
+ rParam.bRegExp = FALSE;
+ rParam.bDuplicate = TRUE;
+}
+
+bool ScInternalDoubleRef::isRangeEqual(const ScRange& rRange) const
+{
+ return maRange == rRange;
+}
+
+// ============================================================================
+
+ScExternalDoubleRef::ScExternalDoubleRef(ScDocument* pDoc) :
+ ScDoubleRefBase(pDoc, EXTERNAL)
+{
+}
+
+ScExternalDoubleRef::~ScExternalDoubleRef()
+{
+}
+
+SCCOL ScExternalDoubleRef::getFirstFieldColumn()
+{
+ return -1;
+}
+
+SCCOL ScExternalDoubleRef::findFieldColumn(SCCOL nColIndex)
+{
+ return -1;
+}
+
+SCCOL ScExternalDoubleRef::findFieldColumn(const OUString& rStr, sal_uInt16& rErr)
+{
+ return -1;
+}
+
+void ScExternalDoubleRef::initQueryParam(ScQueryParam& rParam) const
+{
+}
+
+bool ScExternalDoubleRef::isRangeEqual(const ScRange& /*rRange*/) const
+{
+ return false;
+}