diff options
Diffstat (limited to 'reportdesign/source/core/misc/reportformula.cxx')
-rw-r--r-- | reportdesign/source/core/misc/reportformula.cxx | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/reportdesign/source/core/misc/reportformula.cxx b/reportdesign/source/core/misc/reportformula.cxx new file mode 100644 index 000000000000..2ceef3340ef0 --- /dev/null +++ b/reportdesign/source/core/misc/reportformula.cxx @@ -0,0 +1,183 @@ +/************************************************************************* + * + * 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 "precompiled_reportdesign.hxx" +#include "reportformula.hxx" + +/** === begin UNO includes === **/ +/** === end UNO includes === **/ + +#include <rtl/ustrbuf.hxx> + +//........................................................................ +namespace rptui +{ +//........................................................................ + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Any; + /** === end UNO using === **/ + + namespace + { + //---------------------------------------------------------------- + const ::rtl::OUString& lcl_getExpressionPrefix( sal_Int32* _pTakeLengthOrNull = NULL ) + { + static ::rtl::OUString s_sPrefix( RTL_CONSTASCII_USTRINGPARAM( "rpt:" ) ); + if ( _pTakeLengthOrNull ) + *_pTakeLengthOrNull = s_sPrefix.getLength(); + return s_sPrefix; + } + + //---------------------------------------------------------------- + const ::rtl::OUString& lcl_getFieldPrefix( sal_Int32* _pTakeLengthOrNull = NULL ) + { + static ::rtl::OUString s_sPrefix( RTL_CONSTASCII_USTRINGPARAM( "field:" ) ); + if ( _pTakeLengthOrNull ) + *_pTakeLengthOrNull = s_sPrefix.getLength(); + return s_sPrefix; + } + } + + //==================================================================== + //= ReportFormula + //==================================================================== + //-------------------------------------------------------------------- + ReportFormula::ReportFormula( const ::rtl::OUString& _rFormula ) + :m_eType( Invalid ) + { + impl_construct( _rFormula ); + } + + //-------------------------------------------------------------------- + ReportFormula::ReportFormula( const BindType _eType, const ::rtl::OUString& _rFieldOrExpression ) + :m_eType( _eType ) + { + switch ( m_eType ) + { + case Expression: + { + if ( _rFieldOrExpression.indexOf( lcl_getExpressionPrefix() ) == 0 ) + m_sCompleteFormula = _rFieldOrExpression; + else + m_sCompleteFormula = lcl_getExpressionPrefix() + _rFieldOrExpression; + } + break; + + case Field: + { + ::rtl::OUStringBuffer aBuffer; + aBuffer.append( lcl_getFieldPrefix() ); + aBuffer.appendAscii( "[" ); + aBuffer.append( _rFieldOrExpression ); + aBuffer.appendAscii( "]" ); + m_sCompleteFormula = aBuffer.makeStringAndClear(); + } + break; + default: + OSL_ENSURE( false, "ReportFormula::ReportFormula: illegal bind type!" ); + return; + } + + m_sUndecoratedContent = _rFieldOrExpression; + } + //-------------------------------------------------------------------- + ReportFormula::~ReportFormula() + { + } + //-------------------------------------------------------------------- + void ReportFormula::impl_construct( const ::rtl::OUString& _rFormula ) + { + m_sCompleteFormula = _rFormula; + + sal_Int32 nPrefixLen( -1 ); + // is it an ordinary expression? + if ( m_sCompleteFormula.indexOf( lcl_getExpressionPrefix( &nPrefixLen ) ) == 0 ) + { + m_eType = Expression; + m_sUndecoratedContent = m_sCompleteFormula.copy( nPrefixLen ); + return; + } + + /// does it refer to a field? + if ( m_sCompleteFormula.indexOf( lcl_getFieldPrefix( &nPrefixLen ) ) == 0 ) + { + if ( ( m_sCompleteFormula.getLength() >= nPrefixLen + 2 ) + && ( m_sCompleteFormula[ nPrefixLen ] == '[' ) + && ( m_sCompleteFormula[ m_sCompleteFormula.getLength() - 1 ] == ']' ) + ) + { + m_eType = Field; + m_sUndecoratedContent = m_sCompleteFormula.copy( nPrefixLen + 1, m_sCompleteFormula.getLength() - nPrefixLen - 2 ); + return; + } + } + + m_eType = Invalid; + } + + //-------------------------------------------------------------------- + ::rtl::OUString ReportFormula::getBracketedFieldOrExpression() const + { + bool bIsField = ( getType() == Field ); + ::rtl::OUStringBuffer aFieldContent; + if ( bIsField ) + aFieldContent.appendAscii( "[" ); + aFieldContent.append( getUndecoratedContent() ); + if ( bIsField ) + aFieldContent.appendAscii( "]" ); + + return aFieldContent.makeStringAndClear(); + } + //-------------------------------------------------------------------- + const ::rtl::OUString& ReportFormula::getUndecoratedContent() const + { + return m_sUndecoratedContent; + } + const ::rtl::OUString& ReportFormula::getCompleteFormula() const { return m_sCompleteFormula; } + bool ReportFormula::isValid() const { return getType() != Invalid; } + ReportFormula& ReportFormula::operator=(class ReportFormula const & _rHd) + { + if ( this == &_rHd ) + return *this; + m_eType = _rHd.m_eType; + m_sCompleteFormula = _rHd.m_sCompleteFormula; + m_sUndecoratedContent = _rHd.m_sUndecoratedContent; + return *this; + } + //-------------------------------------------------------------------- + ::rtl::OUString ReportFormula::getEqualUndecoratedContent() const + { + ::rtl::OUStringBuffer aBuffer; + aBuffer.appendAscii( "=" ); + aBuffer.append( getUndecoratedContent() ); + return aBuffer.makeStringAndClear(); + } + +//........................................................................ +} // namespace rptui +//........................................................................ + |