User: hr Date: 2007-08-02 14:35:52+0000 Modified: dba/reportdesign/source/ui/dlg/Condition.cxx
Log: INTEGRATION: CWS rpt23fix01 (1.2.2); FILE MERGED 2007/07/16 19:35:57 fs 1.2.2.2: #i77800# some more outsourcing 2007/07/16 13:43:53 fs 1.2.2.1: #i77800# outsourced ExpressionFactory and friends to a dedicated file (conditionalexpression.*) File Changes: Directory: /dba/reportdesign/source/ui/dlg/ =========================================== File [changed]: Condition.cxx Url: http://dba.openoffice.org/source/browse/dba/reportdesign/source/ui/dlg/Condition.cxx?r1=1.2&r2=1.3 Delta lines: +10 -183 ---------------------- --- Condition.cxx 2007-07-09 11:56:29+0000 1.2 +++ Condition.cxx 2007-08-02 14:35:50+0000 1.3 @@ -205,172 +205,6 @@ } // ============================================================================= -// = IExpressionFactory -// ============================================================================= -class SAL_NO_VTABLE IExpressionFactory -{ -public: - virtual ::rtl::OUString assembleExpression( const ::rtl::OUString& _rFieldDataSource, const ::rtl::OUString& _rLHS, const ::rtl::OUString& _rRHS ) const = 0; - virtual bool matchExpression( const ::rtl::OUString& _rExpression, const ::rtl::OUString& _rFieldDataSource, ::rtl::OUString& _out_rLHS, ::rtl::OUString& _out_rRHS ) const = 0; - - virtual ~IExpressionFactory() { } -}; - -// ============================================================================= -// = ExpressionFactory -// ============================================================================= -class ExpressionFactory : public IExpressionFactory -{ -private: - const ::rtl::OUString m_sPattern; - -public: - ExpressionFactory( const sal_Char* _pAsciiPattern ); - - // IExpressionFactory - virtual ::rtl::OUString assembleExpression( const ::rtl::OUString& _rFieldDataSource, const ::rtl::OUString& _rLHS, const ::rtl::OUString& _rRHS ) const; - virtual bool matchExpression( const ::rtl::OUString& _rExpression, const ::rtl::OUString& _rFieldDataSource, ::rtl::OUString& _out_rLHS, ::rtl::OUString& _out_rRHS ) const; -}; - -// ----------------------------------------------------------------------------- -ExpressionFactory::ExpressionFactory( const sal_Char* _pAsciiPattern ) - :m_sPattern( ::rtl::OUString::createFromAscii( _pAsciiPattern ) ) -{ -} - -// ----------------------------------------------------------------------------- -::rtl::OUString ExpressionFactory::assembleExpression( const ::rtl::OUString& _rFieldDataSource, const ::rtl::OUString& _rLHS, const ::rtl::OUString& _rRHS ) const -{ - ::rtl::OUString sExpression( m_sPattern ); - - sal_Int32 nPatternIndex = sExpression.indexOf( '$' ); - while ( nPatternIndex > -1 ) - { - const ::rtl::OUString* pReplace = NULL; - switch ( sExpression.getStr()[ nPatternIndex + 1 ] ) - { - case '$': pReplace = &_rFieldDataSource; break; - case '1': pReplace = &_rLHS; break; - case '2': pReplace = &_rRHS; break; - default: break; - } - - if ( pReplace == NULL ) - { - OSL_ENSURE( false, "ExpressionFactory::assembleExpression: illegal pattern!" ); - break; - } - - sExpression = sExpression.replaceAt( nPatternIndex, 2, *pReplace ); - nPatternIndex = sExpression.indexOf( '$', nPatternIndex + pReplace->getLength() + 1 ); - } - return sExpression; -} - -// ----------------------------------------------------------------------------- -bool ExpressionFactory::matchExpression( const ::rtl::OUString& _rExpression, const ::rtl::OUString& _rFieldDataSource, ::rtl::OUString& _out_rLHS, ::rtl::OUString& _out_rRHS ) const -{ - (void)_rExpression; - (void)_rFieldDataSource; - (void)_out_rLHS; - (void)_out_rRHS; - - // if we had regular expression, the matching would be pretty easy ... - // just replace $1 and $2 in the pattern with (.*), and then get them with \1 resp. \2. - // Unfortunately, we don't have such a regexp engine ... - - // Okay, let's start with replacing all $$ in our pattern with the actual field data source - ::rtl::OUString sMatchExpression( m_sPattern ); - const ::rtl::OUString sFieldDataPattern( RTL_CONSTASCII_USTRINGPARAM( "$$" ) ); - sal_Int32 nIndex( sMatchExpression.indexOf( sFieldDataPattern ) ); - while ( nIndex != -1 ) - { - sMatchExpression = sMatchExpression.replaceAt( nIndex, sFieldDataPattern.getLength(), _rFieldDataSource ); - nIndex = sMatchExpression.indexOf( sFieldDataPattern, nIndex + _rFieldDataSource.getLength() ); - } - - const ::rtl::OUString sLHSPattern( RTL_CONSTASCII_USTRINGPARAM( "$1" ) ); - const ::rtl::OUString sRHSPattern( RTL_CONSTASCII_USTRINGPARAM( "$2" ) ); - sal_Int32 nLHSIndex( sMatchExpression.indexOf( sLHSPattern ) ); - sal_Int32 nRHSIndex( sMatchExpression.indexOf( sRHSPattern ) ); - - // now we should have at most one occurance of $1 and $2, resp. - OSL_ENSURE( sMatchExpression.indexOf( sLHSPattern, nLHSIndex + 1 ) == -1, - "ExpressionFactory::matchExpression: unsupported pattern (more than one LHS occurance)!" ); - OSL_ENSURE( sMatchExpression.indexOf( sRHSPattern, nRHSIndex + 1 ) == -1, - "ExpressionFactory::matchExpression: unsupported pattern (more than one RHS occurance)!" ); - // Also, an LHS must be present, and precede the RHS (if present) - OSL_ENSURE( ( nLHSIndex != -1 ) && ( ( nLHSIndex < nRHSIndex ) || ( nRHSIndex == -1 ) ), - "ExpressionFactory::matchExpression: no LHS, or an RHS preceeding the LHS - this is not supported!" ); - - // up to the occurance of the LHS (which must exist, see above), the two expressions - // must be identical - if ( _rExpression.getLength() < nLHSIndex ) - return false; - const ::rtl::OUString sExprPart1( _rExpression.copy( 0, nLHSIndex ) ); - const ::rtl::OUString sMatchExprPart1( sMatchExpression.copy( 0, nLHSIndex ) ); - if ( sExprPart1 != sMatchExprPart1 ) - // the left-most expression parts do not match - return false; - - // after the occurance of the RHS (or the LHS, if there is no RHS), the two expressions - // must be identical, too - bool bHaveRHS( nRHSIndex != -1 ); - sal_Int32 nRightMostIndex( bHaveRHS ? nRHSIndex : nLHSIndex ); - const ::rtl::OUString sMatchExprPart3( sMatchExpression.copy( nRightMostIndex + 2 ) ); - if ( _rExpression.getLength() < sMatchExprPart3.getLength() ) - // the expression is not even long enough to hold the right-most part of the match expression - return false; - const ::rtl::OUString sExprPart3( _rExpression.copy( _rExpression.getLength() - sMatchExprPart3.getLength() ) ); - if ( sExprPart3 != sMatchExprPart3 ) - // the right-most expression parts do not match - return false; - - // if we don't have an RHS, we're done - if ( !bHaveRHS ) - { - _out_rLHS = _rExpression.copy( sExprPart1.getLength(), _rExpression.getLength() - sExprPart1.getLength() - sExprPart3.getLength() ); - return true; - } - - // strip the match expression by its right-most and left-most part, and by the placeholders $1 and $2 - sal_Int32 nMatchExprPart2Start( nLHSIndex + sLHSPattern.getLength() ); - ::rtl::OUString sMatchExprPart2 = sMatchExpression.copy( - nMatchExprPart2Start, - sMatchExpression.getLength() - nMatchExprPart2Start - sMatchExprPart3.getLength() - 2 - ); - // strip the expression by its left-most and right-most part - const ::rtl::OUString sExpression( _rExpression.copy( - sExprPart1.getLength(), - _rExpression.getLength() - sExprPart1.getLength() - sExprPart3.getLength() - ) ); - - sal_Int32 nPart2Index = sExpression.indexOf( sMatchExprPart2 ); - if ( nPart2Index == -1 ) - // the "middle" part of the match expression does not exist in the expression at all - return false; - - OSL_ENSURE( sExpression.indexOf( sMatchExprPart2, nPart2Index + 1 ) == -1, - "ExpressionFactory::matchExpression: ambiguous matching!" ); - // if this fires, then we're lost: The middle part exists two times in the expression, - // so we cannot reliably determine what's the LHS and what's the RHS. - // Well, the whole mechanism is flawed, anyway: - // Encoding the field content in the conditional expression will break as soon - // as somebody - // - assigns a Data Field to a control - // - creates a conditional format expression for the control - // - assigns another Data Field to the control - // - opens the Conditional Format Dialog, again - // Here, at the latest, you can see that we need another mechanism, anyway, which does not - // rely on those strange expression building/matching - - _out_rLHS = sExpression.copy( 0, nPart2Index ); - _out_rRHS = sExpression.copy( nPart2Index + sMatchExprPart2.getLength() ); - - return true; -} - -// ============================================================================= // = Condition // ============================================================================= // ----------------------------------------------------------------------------- @@ -455,14 +289,7 @@ impl_layoutAll(); - m_aFieldExprFactories[ eBetween ] = PExpressionFactory( new ExpressionFactory( "AND( ( $$ ) >= ( $1 ); ( $$ ) <= ( $2 ) )" ) ); - m_aFieldExprFactories[ eNotBetween ] = PExpressionFactory( new ExpressionFactory( "NOT( AND( ( $$ ) >= ( $1 ); ( $$ ) <= ( $2 ) ) )" ) ); - m_aFieldExprFactories[ eEqualTo ] = PExpressionFactory( new ExpressionFactory( "( $$ ) = ( $1 )" ) ); - m_aFieldExprFactories[ eNotEqualTo ] = PExpressionFactory( new ExpressionFactory( "( $$ ) <> ( $1 )" ) ); - m_aFieldExprFactories[ eGreaterThan ] = PExpressionFactory( new ExpressionFactory( "( $$ ) > ( $1 )" ) ); - m_aFieldExprFactories[ eLessThan ] = PExpressionFactory( new ExpressionFactory( "( $$ ) < ( $1 )" ) ); - m_aFieldExprFactories[ eGreaterOrEqual ] = PExpressionFactory( new ExpressionFactory( "( $$ ) >= ( $1 )" ) ); - m_aFieldExprFactories[ eLessOrEqual ] = PExpressionFactory( new ExpressionFactory( "( $$ ) <= ( $1 )" ) ); + ConditionalExpressionFactory::getKnownConditionalExpressions( m_aConditionalExpressions ); } // ----------------------------------------------------------------------------- @@ -763,15 +590,15 @@ const ::rtl::OUString sUnprefixedFieldContent( aFieldContentFormula.getBracketedFieldOrExpression() ); // check whether one of the Field Value Expression Factories recognizes the expression - for ( ExpressionFactories::const_iterator fac = m_aFieldExprFactories.begin(); - fac != m_aFieldExprFactories.end(); - ++fac + for ( ConditionalExpressions::const_iterator exp = m_aConditionalExpressions.begin(); + exp != m_aConditionalExpressions.end(); + ++exp ) { - if ( fac->second->matchExpression( sExpression, sUnprefixedFieldContent, sLHS, sRHS ) ) + if ( exp->second->matchExpression( sExpression, sUnprefixedFieldContent, sLHS, sRHS ) ) { eType = eFieldValueComparison; - eOperation = fac->first; + eOperation = exp->first; break; } } @@ -855,7 +682,7 @@ ReportFormula aFieldContentFormula( m_rAction.getDataField() ); ::rtl::OUString sUnprefixedFieldContent( aFieldContentFormula.getBracketedFieldOrExpression() ); - PExpressionFactory pFactory( m_aFieldExprFactories[ eOperation ] ); + PConditionalExpression pFactory( m_aConditionalExpressions[ eOperation ] ); sUndecoratedFormula = pFactory->assembleExpression( sUnprefixedFieldContent, sLHS, sRHS ); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
