diff options
author | Kohei Yoshida <kohei.yoshida@suse.com> | 2012-02-09 15:12:49 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@suse.com> | 2012-02-09 15:25:09 -0500 |
commit | 2bf0fd735210b961d15f5bccede1bef926b5d824 (patch) | |
tree | 86b4a4db426dc7c7d6761a7e42aaa4929f21cea9 /sc/source/core/data/dpitemdata.cxx | |
parent | dc261fc0c4e7f4c29b142c53d4d4e65f8ff3a092 (diff) |
Moved ScDPItemData into own files.
Diffstat (limited to 'sc/source/core/data/dpitemdata.cxx')
-rw-r--r-- | sc/source/core/data/dpitemdata.cxx | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/sc/source/core/data/dpitemdata.cxx b/sc/source/core/data/dpitemdata.cxx new file mode 100644 index 000000000000..6a06cae1725f --- /dev/null +++ b/sc/source/core/data/dpitemdata.cxx @@ -0,0 +1,285 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * Copyright (C) 2012 Kohei Yoshida <kohei.yoshida@suse.com> + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#include "dpitemdata.hxx" + +#include "document.hxx" +#include "dpobject.hxx" +#include "cell.hxx" +#include "globstr.hrc" +#include "dptabdat.hxx" + +bool ScDPItemData::isDate( sal_uLong nNumType ) +{ + return ((nNumType & NUMBERFORMAT_DATE) != 0) ? 1 : 0; +} + +ScDPItemData::ScDPItemData() : + mnNumFormat( 0 ), mfValue(0.0), mbFlag(0) {} + +ScDPItemData::ScDPItemData(sal_uLong nNF, const String & rS, double fV, sal_uInt8 bF) : + mnNumFormat(nNF), maString(rS), mfValue(fV), mbFlag(bF) {} + +ScDPItemData::ScDPItemData(const String& rS, double fV, bool bHV, const sal_uLong nNumFormatP, bool bData) : + mnNumFormat( nNumFormatP ), maString(rS), mfValue(fV), + mbFlag( (MK_VAL*!!bHV) | (MK_DATA*!!bData) | (MK_ERR*!!false) | (MK_DATE*!!isDate( mnNumFormat ) ) ) +{ +} + +ScDPItemData::ScDPItemData(ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nDocTab, bool bLabel) : + mnNumFormat( 0 ), mfValue(0.0), mbFlag( 0 ) +{ + String aDocStr; + pDoc->GetString( nCol, nRow, nDocTab, aDocStr ); + + SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); + + ScAddress aPos( nCol, nRow, nDocTab ); + ScBaseCell* pCell = pDoc->GetCell( aPos ); + + if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA && ((ScFormulaCell*)pCell)->GetErrCode() ) + { + SetString ( aDocStr ); + mbFlag |= MK_ERR; + } + else if ( pDoc->HasValueData( nCol, nRow, nDocTab ) ) + { + double fVal = pDoc->GetValue(ScAddress(nCol, nRow, nDocTab)); + sal_uLong nFormat = NUMBERFORMAT_NUMBER; + if ( pFormatter ) + nFormat = pFormatter->GetType( pDoc->GetNumberFormat( ScAddress( nCol, nRow, nDocTab ) ) ); + maString = aDocStr; + mfValue = fVal; + mbFlag |= MK_VAL|MK_DATA; + mnNumFormat = pDoc->GetNumberFormat( ScAddress( nCol, nRow, nDocTab ) ); + isDate( nFormat ) ? ( mbFlag |= MK_DATE ) : (mbFlag &= ~MK_DATE); + } + else if (bLabel || pDoc->HasData(nCol, nRow, nDocTab)) + { + if (bLabel && !aDocStr.Len()) + { + // Replace an empty label string with column name. + rtl::OUStringBuffer aBuf; + aBuf.append(ScGlobal::GetRscString(STR_COLUMN)); + aBuf.append(sal_Unicode(' ')); + + ScAddress aColAddr(nCol, 0, 0); + rtl::OUString aColStr; + aColAddr.Format(aColStr, SCA_VALID_COL, NULL); + aBuf.append(aColStr); + aDocStr = aBuf.makeStringAndClear(); + } + + SetString(aDocStr); + } +} + +void ScDPItemData::SetString( const String& rS ) +{ + maString = rS; + mbFlag &= ~(MK_VAL|MK_DATE); + mnNumFormat = 0; + mbFlag |= MK_DATA; +} + +bool ScDPItemData::IsCaseInsEqual( const ScDPItemData& r ) const +{ + //! pass Transliteration? + //! inline? + return IsValue() ? ( r.IsValue() && rtl::math::approxEqual( mfValue, r.mfValue ) ) : + ( !r.IsValue() && + ScGlobal::GetpTransliteration()->isEqual( maString, r.maString ) ); +} + +size_t ScDPItemData::Hash() const +{ + if ( IsValue() ) + return (size_t) rtl::math::approxFloor( mfValue ); + else + // If we do unicode safe case insensitive hash we can drop + // ScDPItemData::operator== and use ::IsCasInsEqual + return rtl_ustr_hashCode_WithLength( maString.GetBuffer(), maString.Len() ); +} + +bool ScDPItemData::operator==( const ScDPItemData& r ) const +{ + if ( IsValue() ) + { + if( (HasDatePart() != r.HasDatePart()) || (HasDatePart() && mnDatePart != r.mnDatePart) ) + return false; + + if ( IsDate() != r.IsDate() ) + return false; + else if ( r.IsValue() ) + return rtl::math::approxEqual( mfValue, r.mfValue ); + else + return false; + } + else if ( r.IsValue() ) + return false; + else + // need exact equality until we have a safe case insensitive string hash + return maString == r.maString; +} + +sal_Int32 ScDPItemData::Compare( const ScDPItemData& rA, + const ScDPItemData& rB ) +{ + if ( rA.IsValue() ) + { + if ( rB.IsValue() ) + { + if ( rtl::math::approxEqual( rA.mfValue, rB.mfValue ) ) + { + if ( rA.IsDate() == rB.IsDate() ) + return 0; + else + return rA.IsDate() ? 1: -1; + } + else if ( rA.mfValue < rB.mfValue ) + return -1; + else + return 1; + } + else + return -1; // values first + } + else if ( rB.IsValue() ) + return 1; // values first + else + return ScGlobal::GetCollator()->compareString( rA.maString, rB.maString ); +} + +sal_uInt8 ScDPItemData::GetType() const +{ + if ( IsHasErr() ) + return SC_VALTYPE_ERROR; + else if ( !IsHasData() ) + return SC_VALTYPE_EMPTY; + else if ( IsValue()) + return SC_VALTYPE_VALUE; + else + return SC_VALTYPE_STRING; +} + +bool ScDPItemData::IsHasData() const +{ + return !!(mbFlag&MK_DATA); +} + +bool ScDPItemData::IsHasErr() const +{ + return !!(mbFlag&MK_ERR); +} + +bool ScDPItemData::IsValue() const +{ + return !!(mbFlag&MK_VAL); +} + +String ScDPItemData::GetString() const +{ + return maString; +} + +double ScDPItemData::GetValue() const +{ + return mfValue; +} + +bool ScDPItemData::HasStringData() const +{ + return IsHasData()&&!IsHasErr()&&!IsValue(); +} + +bool ScDPItemData::IsDate() const +{ + return !!(mbFlag&MK_DATE); +} + +bool ScDPItemData::HasDatePart() const +{ + return !!(mbFlag&MK_DATEPART); +} + +void ScDPItemData::SetDate( bool b ) +{ + b ? ( mbFlag |= MK_DATE ) : ( mbFlag &= ~MK_DATE ); +} + + +ScDPItemDataPool::ScDPItemDataPool() +{ +} + +ScDPItemDataPool::ScDPItemDataPool(const ScDPItemDataPool& r): + maItems(r.maItems), + maItemIds(r.maItemIds) +{ +} + +ScDPItemDataPool::~ScDPItemDataPool() +{ +} + + +const ScDPItemData* ScDPItemDataPool::getData( sal_Int32 nId ) +{ + if ( nId >= static_cast<sal_Int32>(maItems.size()) ) + return NULL; + else + return &(maItems[nId]); +} + +sal_Int32 ScDPItemDataPool::getDataId( const ScDPItemData& aData ) +{ + DataHash::const_iterator itr = maItemIds.find( aData), + itrEnd = maItemIds.end(); + if ( itr == itrEnd ) + // not exist + return -1; + + else //exist + return itr->second; + +} + +sal_Int32 ScDPItemDataPool::insertData( const ScDPItemData& aData ) +{ + sal_Int32 nResult = getDataId( aData ); + + if( nResult < 0 ) + { + maItemIds.insert( DataHash::value_type( aData, nResult = maItems.size() ) ); + maItems.push_back( aData ); + } + + return nResult; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |