Kaydet (Commit) e7c10fba authored tarafından Noel Grandin's avatar Noel Grandin

remove usage of STRING_NOTFOUND in formula.cxx

and tidy up the method a little

Change-Id: I408fd96286749ec9e3743dbdad8cf424a7bb9035
üst a0be5278
...@@ -463,109 +463,109 @@ namespace ...@@ -463,109 +463,109 @@ namespace
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
sal_Int32 FormulaDlg_Impl::GetFunctionPos(sal_Int32 nPos) sal_Int32 FormulaDlg_Impl::GetFunctionPos(sal_Int32 nPos)
{ {
if ( !m_aTokenList.hasElements() )
return SAL_MAX_INT32;
const sal_Unicode sep = m_pHelper->getFunctionManager()->getSingleToken(IFunctionManager::eSep); const sal_Unicode sep = m_pHelper->getFunctionManager()->getSingleToken(IFunctionManager::eSep);
sal_Int32 nFuncPos = STRING_NOTFOUND; sal_Int32 nFuncPos = SAL_MAX_INT32;
sal_Bool bFlag = sal_False; sal_Bool bFlag = sal_False;
OUString aFormString = m_aFormulaHelper.GetCharClass()->uppercase(pMEdit->GetText()); OUString aFormString = m_aFormulaHelper.GetCharClass()->uppercase(pMEdit->GetText());
if ( m_aTokenList.getLength() ) const uno::Reference< sheet::XFormulaParser > xParser(m_pHelper->getFormulaParser());
{ const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
const uno::Reference< sheet::XFormulaParser > xParser(m_pHelper->getFormulaParser());
const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
const sheet::FormulaToken* pIter = m_aTokenList.getConstArray(); const sheet::FormulaToken* pIter = m_aTokenList.getConstArray();
const sheet::FormulaToken* pEnd = pIter + m_aTokenList.getLength(); const sheet::FormulaToken* pEnd = pIter + m_aTokenList.getLength();
try try
{
sal_Int32 nTokPos = 1;
sal_Int32 nOldTokPos = 1;
sal_Int32 nPrevFuncPos = 1;
short nBracketCount = 0;
while ( pIter != pEnd )
{ {
sal_Int32 nTokPos=1; const sal_Int32 eOp = pIter->OpCode;
sal_Int32 nOldTokPos=1; uno::Sequence<sheet::FormulaToken> aArgs(1);
sal_Int32 nPrevFuncPos = 1; aArgs[0] = *pIter;
short nBracketCount = 0; const OUString aString = xParser->printFormula(aArgs, aRefPos);
while ( pIter != pEnd ) const sheet::FormulaToken* pNextToken = pIter + 1;
if( !bUserMatrixFlag && FormulaCompiler::IsMatrixFunction((OpCode)eOp) )
{ {
const sal_Int32 eOp = pIter->OpCode; aBtnMatrix.Check();
uno::Sequence<sheet::FormulaToken> aArgs(1); }
aArgs[0] = *pIter;
const OUString aString = xParser->printFormula(aArgs, aRefPos);
const sheet::FormulaToken* pNextToken = pIter + 1;
if(!bUserMatrixFlag && FormulaCompiler::IsMatrixFunction((OpCode)eOp) ) if( eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::PUSH].Token.OpCode ||
eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode )
{
const sal_Int32 n1 = aFormString.indexOf(sep, nTokPos);
const sal_Int32 n2 = aFormString.indexOf(')',nTokPos);
sal_Int32 nXXX = nTokPos;
if( n1 < n2 )
{ {
aBtnMatrix.Check(); nTokPos=n1;
}
if ( eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::PUSH].Token.OpCode ||
eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode )
{
const sal_Int32 n1 = aFormString.indexOf(sep, nTokPos);
const sal_Int32 n2 = aFormString.indexOf(')',nTokPos);
sal_Int32 nXXX = nTokPos;
if(n1<n2)
{
nTokPos=n1;
}
else
{
nTokPos=n2;
}
if ( pNextToken != pEnd )
{
aArgs[0] = *pNextToken;
const OUString a2String = xParser->printFormula(aArgs, aRefPos);
const sal_Int32 n3 = aFormString.indexOf(a2String,nXXX);
if ( n3 < nTokPos )
nTokPos = n3;
}
} }
else else
{ {
nTokPos = nTokPos + aString.getLength(); nTokPos=n2;
} }
if( pNextToken != pEnd )
if ( eOp == m_aSeparatorsOpCodes[TOKEN_OPEN].OpCode )
{ {
nBracketCount++; aArgs[0] = *pNextToken;
bFlag=sal_True; const OUString a2String = xParser->printFormula(aArgs, aRefPos);
const sal_Int32 n3 = aFormString.indexOf(a2String,nXXX);
if ( n3 < nTokPos )
nTokPos = n3;
} }
else if ( eOp == m_aSeparatorsOpCodes[TOKEN_CLOSE].OpCode ) }
{ else
nBracketCount--; {
bFlag=sal_False; nTokPos = nTokPos + aString.getLength();
nFuncPos=nPrevFuncPos; }
}
bool bIsFunction = ::std::find_if(m_aFunctionOpCodes.getConstArray(),m_pFunctionOpCodesEnd,::std::bind2nd(OpCodeCompare(),boost::cref(eOp))) != m_pFunctionOpCodesEnd;
if ( bIsFunction && m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode != eOp ) if( eOp == m_aSeparatorsOpCodes[TOKEN_OPEN].OpCode )
{ {
nPrevFuncPos = nFuncPos; nBracketCount++;
nFuncPos = nOldTokPos; bFlag = sal_True;
} }
else if( eOp == m_aSeparatorsOpCodes[TOKEN_CLOSE].OpCode )
{
nBracketCount--;
bFlag = sal_False;
nFuncPos = nPrevFuncPos;
}
bool bIsFunction = ::std::find_if(m_aFunctionOpCodes.getConstArray(),m_pFunctionOpCodesEnd,::std::bind2nd(OpCodeCompare(),boost::cref(eOp))) != m_pFunctionOpCodesEnd;
if( bIsFunction && m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode != eOp )
{
nPrevFuncPos = nFuncPos;
nFuncPos = nOldTokPos;
}
if ( nOldTokPos <= nPos && nPos < nTokPos ) if( nOldTokPos <= nPos && nPos < nTokPos )
{
if( !bIsFunction )
{ {
if ( !bIsFunction ) if( nBracketCount < 1 )
{
nFuncPos = pMEdit->GetText().getLength();
}
else if( !bFlag )
{ {
if ( nBracketCount < 1 ) nFuncPos = nPrevFuncPos;
{
nFuncPos= pMEdit->GetText().getLength();
}
else if ( !bFlag )
{
nFuncPos=nPrevFuncPos;
}
} }
break;
} }
break;
}
pIter = pNextToken; pIter = pNextToken;
nOldTokPos = nTokPos; nOldTokPos = nTokPos;
} // while ( pIter != pEnd ) } // while ( pIter != pEnd )
} }
catch(const uno::Exception& ) catch( const uno::Exception& )
{ {
OSL_FAIL("Exception caught!"); OSL_FAIL("Exception caught!");
}
} }
return nFuncPos; return nFuncPos;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment