From bf207a0ed79c4b606ad1a6e2d5ca0fb00a6feeb8 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Tue, 14 Apr 2020 12:08:06 +0200 Subject: loplugin:flatten in formula Change-Id: I90054df6949cf966b9edc706b2e29c2a57553be9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92161 Tested-by: Jenkins Reviewed-by: Noel Grandin --- formula/source/core/api/FormulaCompiler.cxx | 102 +++---- formula/source/ui/dlg/formula.cxx | 450 ++++++++++++++-------------- formula/source/ui/dlg/parawin.cxx | 114 +++---- formula/source/ui/dlg/structpg.cxx | 24 +- 4 files changed, 345 insertions(+), 345 deletions(-) diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index fedd6b36fcf4..e8c92c990509 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -932,19 +932,19 @@ void FormulaCompiler::InitSymbolsOOXML() const void FormulaCompiler::loadSymbols(const std::pair* pSymbols, FormulaGrammar::Grammar eGrammar, NonConstOpCodeMapPtr& rxMap, SeparatorType eSepType) const { - if ( !rxMap.get() ) - { - // not Core - rxMap = std::make_shared( SC_OPCODE_LAST_OPCODE_ID + 1, eGrammar != FormulaGrammar::GRAM_ODFF, eGrammar ); - OpCodeList aOpCodeList(false, pSymbols, rxMap, eSepType); + if ( rxMap.get() ) + return; - fillFromAddInMap( rxMap, eGrammar); - // Fill from collection for AddIns not already present. - if ( FormulaGrammar::GRAM_ENGLISH != eGrammar ) - fillFromAddInCollectionUpperName( rxMap); - else - fillFromAddInCollectionEnglishName( rxMap); - } + // not Core + rxMap = std::make_shared( SC_OPCODE_LAST_OPCODE_ID + 1, eGrammar != FormulaGrammar::GRAM_ODFF, eGrammar ); + OpCodeList aOpCodeList(false, pSymbols, rxMap, eSepType); + + fillFromAddInMap( rxMap, eGrammar); + // Fill from collection for AddIns not already present. + if ( FormulaGrammar::GRAM_ENGLISH != eGrammar ) + fillFromAddInCollectionUpperName( rxMap); + else + fillFromAddInCollectionEnglishName( rxMap); } void FormulaCompiler::fillFromAddInCollectionUpperName( const NonConstOpCodeMapPtr& /*xMap */) const @@ -2142,26 +2142,26 @@ bool FormulaCompiler::CompileTokenArray() void FormulaCompiler::PopTokenArray() { - if( pStack ) - { - FormulaArrayStack* p = pStack; - pStack = p->pNext; - // obtain special RecalcMode from SharedFormula - if ( pArr->IsRecalcModeAlways() ) - p->pArr->SetExclusiveRecalcModeAlways(); - else if ( !pArr->IsRecalcModeNormal() && p->pArr->IsRecalcModeNormal() ) - p->pArr->SetMaskedRecalcMode( pArr->GetRecalcMode() ); - p->pArr->SetCombinedBitsRecalcMode( pArr->GetRecalcMode() ); - if ( pArr->IsHyperLink() ) // fdo 87534 - p->pArr->SetHyperLink( true ); - if( p->bTemp ) - delete pArr; - pArr = p->pArr; - maArrIterator = FormulaTokenArrayPlainIterator(*pArr); - maArrIterator.Jump(p->nIndex); - mpLastToken = p->mpLastToken; - delete p; - } + if( !pStack ) + return; + + FormulaArrayStack* p = pStack; + pStack = p->pNext; + // obtain special RecalcMode from SharedFormula + if ( pArr->IsRecalcModeAlways() ) + p->pArr->SetExclusiveRecalcModeAlways(); + else if ( !pArr->IsRecalcModeNormal() && p->pArr->IsRecalcModeNormal() ) + p->pArr->SetMaskedRecalcMode( pArr->GetRecalcMode() ); + p->pArr->SetCombinedBitsRecalcMode( pArr->GetRecalcMode() ); + if ( pArr->IsHyperLink() ) // fdo 87534 + p->pArr->SetHyperLink( true ); + if( p->bTemp ) + delete pArr; + pArr = p->pArr; + maArrIterator = FormulaTokenArrayPlainIterator(*pArr); + maArrIterator.Jump(p->nIndex); + mpLastToken = p->mpLastToken; + delete p; } void FormulaCompiler::CreateStringFromTokenArray( OUString& rFormula ) @@ -2738,28 +2738,28 @@ void FormulaCompiler::ForceArrayOperator( FormulaTokenRef const & rCurr ) return; } - if (nCurrentFactorParam > 0) + if (nCurrentFactorParam <= 0) + return; + + // Actual current parameter's class. + const formula::ParamClass eType = GetForceArrayParameter( + pCurrentFactorToken.get(), static_cast(nCurrentFactorParam - 1)); + if (eType == ParamClass::ForceArray) + rCurr->SetInForceArray( eType); + else if (eType == ParamClass::ReferenceOrForceArray) { - // Actual current parameter's class. - const formula::ParamClass eType = GetForceArrayParameter( - pCurrentFactorToken.get(), static_cast(nCurrentFactorParam - 1)); - if (eType == ParamClass::ForceArray) + if (GetForceArrayParameter( rCurr.get(), SAL_MAX_UINT16) != ParamClass::Reference) rCurr->SetInForceArray( eType); - else if (eType == ParamClass::ReferenceOrForceArray) - { - if (GetForceArrayParameter( rCurr.get(), SAL_MAX_UINT16) != ParamClass::Reference) - rCurr->SetInForceArray( eType); - else - rCurr->SetInForceArray( formula::ParamClass::SuppressedReferenceOrForceArray); - } - - // Propagate a ForceArrayReturn to caller if the called function - // returns one and the caller so far does not have a stronger array - // mode set. - if (pCurrentFactorToken->GetInForceArray() == ParamClass::Unknown - && GetForceArrayParameter( rCurr.get(), SAL_MAX_UINT16) == ParamClass::ForceArrayReturn) - pCurrentFactorToken->SetInForceArray( ParamClass::ForceArrayReturn); + else + rCurr->SetInForceArray( formula::ParamClass::SuppressedReferenceOrForceArray); } + + // Propagate a ForceArrayReturn to caller if the called function + // returns one and the caller so far does not have a stronger array + // mode set. + if (pCurrentFactorToken->GetInForceArray() == ParamClass::Unknown + && GetForceArrayParameter( rCurr.get(), SAL_MAX_UINT16) == ParamClass::ForceArrayReturn) + pCurrentFactorToken->SetInForceArray( ParamClass::ForceArrayReturn); } void FormulaCompiler::CheckSetForceArrayParameter( FormulaTokenRef const & rCurr, sal_uInt8 nParam ) diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx index 2229377b3089..d84e4caea559 100644 --- a/formula/source/ui/dlg/formula.cxx +++ b/formula/source/ui/dlg/formula.cxx @@ -327,23 +327,23 @@ FormulaDlg_Impl::~FormulaDlg_Impl() void FormulaDlg_Impl::StoreFormEditData(FormEditData* pData) { - if (pData) // it won't be destroyed via Close - { - int nStartPos, nEndPos; - m_xMEdit->get_selection_bounds(nStartPos, nEndPos); - if (nStartPos > nEndPos) - std::swap(nStartPos, nEndPos); + if (!pData) // it won't be destroyed via Close + return; + + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); - pData->SetFStart(nStartPos); - pData->SetSelection(Selection(nStartPos, nEndPos)); + pData->SetFStart(nStartPos); + pData->SetSelection(Selection(nStartPos, nEndPos)); - if (m_xTabCtrl->get_current_page_ident() == "function") - pData->SetMode( FormulaDlgMode::Formula ); - else - pData->SetMode( FormulaDlgMode::Edit ); - pData->SetUndoStr(m_xMEdit->get_text()); - pData->SetMatrixFlag(m_xBtnMatrix->get_active()); - } + if (m_xTabCtrl->get_current_page_ident() == "function") + pData->SetMode( FormulaDlgMode::Formula ); + else + pData->SetMode( FormulaDlgMode::Edit ); + pData->SetUndoStr(m_xMEdit->get_text()); + pData->SetMatrixFlag(m_xBtnMatrix->get_active()); } void FormulaDlg_Impl::InitFormulaOpCodeMapper() @@ -557,187 +557,187 @@ void FormulaDlg_Impl::CalcStruct( const OUString& rStrExp, bool bForceRecalcStru { sal_Int32 nLength = rStrExp.getLength(); - if ( !rStrExp.isEmpty() && (bForceRecalcStruct || m_aOldFormula != rStrExp) && m_bStructUpdate) - { - m_xStructPage->ClearStruct(); + if ( !(!rStrExp.isEmpty() && (bForceRecalcStruct || m_aOldFormula != rStrExp) && m_bStructUpdate)) + return; - OUString aString = rStrExp; - if (rStrExp[nLength-1] == '(') - { - aString = aString.copy( 0, nLength-1); - } + m_xStructPage->ClearStruct(); + + OUString aString = rStrExp; + if (rStrExp[nLength-1] == '(') + { + aString = aString.copy( 0, nLength-1); + } - aString = aString.replaceAll( "\n", ""); - OUString aStrResult; + aString = aString.replaceAll( "\n", ""); + OUString aStrResult; - if ( CalcValue( aString, aStrResult ) ) - m_xWndFormResult->set_text(aStrResult); + if ( CalcValue( aString, aStrResult ) ) + m_xWndFormResult->set_text(aStrResult); - UpdateTokenArray(aString); - fillTree(m_xStructPage.get()); + UpdateTokenArray(aString); + fillTree(m_xStructPage.get()); - m_aOldFormula = rStrExp; - if (rStrExp[nLength-1] == '(') - UpdateTokenArray(rStrExp); - } + m_aOldFormula = rStrExp; + if (rStrExp[nLength-1] == '(') + UpdateTokenArray(rStrExp); } void FormulaDlg_Impl::MakeTree(StructPage* _pTree, weld::TreeIter* pParent, const FormulaToken* pFuncToken, const FormulaToken* _pToken, long Count) { - if ( _pToken != nullptr && Count > 0 ) + if ( !(_pToken != nullptr && Count > 0) ) + return; + + long nParas = _pToken->GetParamCount(); + OpCode eOp = _pToken->GetOpCode(); + + // #i101512# for output, the original token is needed + const FormulaToken* pOrigToken = (_pToken->GetType() == svFAP) ? _pToken->GetFAPOrigToken() : _pToken; + uno::Sequence aArgs(1); + ::std::map::const_iterator itr = m_aTokenMap.find(pOrigToken); + if (itr == m_aTokenMap.end()) + return; + + aArgs[0] = itr->second; + try { - long nParas = _pToken->GetParamCount(); - OpCode eOp = _pToken->GetOpCode(); - - // #i101512# for output, the original token is needed - const FormulaToken* pOrigToken = (_pToken->GetType() == svFAP) ? _pToken->GetFAPOrigToken() : _pToken; - uno::Sequence aArgs(1); - ::std::map::const_iterator itr = m_aTokenMap.find(pOrigToken); - if (itr == m_aTokenMap.end()) - return; - - aArgs[0] = itr->second; - try + const table::CellAddress aRefPos(m_pHelper->getReferencePosition()); + const OUString aResult = m_pHelper->getFormulaParser()->printFormula( aArgs, aRefPos); + + if ( nParas > 0 || (nParas == 0 && _pToken->IsFunction()) ) { - const table::CellAddress aRefPos(m_pHelper->getReferencePosition()); - const OUString aResult = m_pHelper->getFormulaParser()->printFormula( aArgs, aRefPos); + std::unique_ptr xEntry; + weld::TreeIter* pEntry; - if ( nParas > 0 || (nParas == 0 && _pToken->IsFunction()) ) - { - std::unique_ptr xEntry; - weld::TreeIter* pEntry; + bool bCalcSubformula = false; + OUString aTest = _pTree->GetEntryText(pParent); - bool bCalcSubformula = false; - OUString aTest = _pTree->GetEntryText(pParent); + if (aTest == aResult && (eOp == ocAdd || eOp == ocMul || eOp == ocAmpersand)) + { + pEntry = pParent; + } + else + { + xEntry = m_xStructPage->GetTlbStruct().make_iterator(); - if (aTest == aResult && (eOp == ocAdd || eOp == ocMul || eOp == ocAmpersand)) + if (eOp == ocBad) + { + _pTree->InsertEntry(aResult, pParent, STRUCT_ERROR, 0, _pToken, *xEntry); + } + else if (!((SC_OPCODE_START_BIN_OP <= eOp && eOp < SC_OPCODE_STOP_BIN_OP) || + (SC_OPCODE_START_UN_OP <= eOp && eOp < SC_OPCODE_STOP_UN_OP))) { - pEntry = pParent; + // Not a binary or unary operator. + bCalcSubformula = true; + _pTree->InsertEntry(aResult, pParent, STRUCT_FOLDER, 0, _pToken, *xEntry); } else { - xEntry = m_xStructPage->GetTlbStruct().make_iterator(); - - if (eOp == ocBad) - { - _pTree->InsertEntry(aResult, pParent, STRUCT_ERROR, 0, _pToken, *xEntry); - } - else if (!((SC_OPCODE_START_BIN_OP <= eOp && eOp < SC_OPCODE_STOP_BIN_OP) || - (SC_OPCODE_START_UN_OP <= eOp && eOp < SC_OPCODE_STOP_UN_OP))) - { - // Not a binary or unary operator. - bCalcSubformula = true; - _pTree->InsertEntry(aResult, pParent, STRUCT_FOLDER, 0, _pToken, *xEntry); - } - else - { - /* TODO: question remains, why not sub calculate operators? */ - _pTree->InsertEntry(aResult, pParent, STRUCT_FOLDER, 0, _pToken, *xEntry); - } - - pEntry = xEntry.get(); + /* TODO: question remains, why not sub calculate operators? */ + _pTree->InsertEntry(aResult, pParent, STRUCT_FOLDER, 0, _pToken, *xEntry); } - MakeTree(_pTree, pEntry, _pToken, m_pTokenArrayIterator->PrevRPN(), nParas); + pEntry = xEntry.get(); + } - if (bCalcSubformula) - { - OUString aFormula; + MakeTree(_pTree, pEntry, _pToken, m_pTokenArrayIterator->PrevRPN(), nParas); - if (!m_bMakingTree) - { - // gets the last subformula result - m_bMakingTree = true; - aFormula = GetPrevFuncExpression( true); - } - else - { - // gets subsequent subformula results (from the back) - aFormula = GetPrevFuncExpression( false); - } + if (bCalcSubformula) + { + OUString aFormula; - OUString aStr; - if (CalcValue( aFormula, aStr, _pToken->IsInForceArray())) - m_xWndResult->set_text( aStr ); - aStr = m_xWndResult->get_text(); - m_xStructPage->GetTlbStruct().set_text(*pEntry, aResult + " = " + aStr); + if (!m_bMakingTree) + { + // gets the last subformula result + m_bMakingTree = true; + aFormula = GetPrevFuncExpression( true); + } + else + { + // gets subsequent subformula results (from the back) + aFormula = GetPrevFuncExpression( false); } - --Count; - m_pTokenArrayIterator->NextRPN(); /* TODO: what's this to be? ThisRPN()? */ - MakeTree( _pTree, pParent, _pToken, m_pTokenArrayIterator->PrevRPN(), Count); + OUString aStr; + if (CalcValue( aFormula, aStr, _pToken->IsInForceArray())) + m_xWndResult->set_text( aStr ); + aStr = m_xWndResult->get_text(); + m_xStructPage->GetTlbStruct().set_text(*pEntry, aResult + " = " + aStr); } - else + + --Count; + m_pTokenArrayIterator->NextRPN(); /* TODO: what's this to be? ThisRPN()? */ + MakeTree( _pTree, pParent, _pToken, m_pTokenArrayIterator->PrevRPN(), Count); + } + else + { + std::unique_ptr xEntry(m_xStructPage->GetTlbStruct().make_iterator()); + if (eOp == ocBad) { - std::unique_ptr xEntry(m_xStructPage->GetTlbStruct().make_iterator()); - if (eOp == ocBad) - { - _pTree->InsertEntry( aResult, pParent, STRUCT_ERROR, 0, _pToken, *xEntry); - } - else if (eOp == ocPush) + _pTree->InsertEntry( aResult, pParent, STRUCT_ERROR, 0, _pToken, *xEntry); + } + else if (eOp == ocPush) + { + // Interpret range reference in matrix context to resolve + // as array elements. Depending on parameter classification + // a scalar value (non-array context) is calculated first. + OUString aUnforcedResult; + bool bForceMatrix = (!m_xBtnMatrix->get_active() && + (_pToken->GetType() == svDoubleRef || _pToken->GetType() == svExternalDoubleRef)); + if (bForceMatrix && pFuncToken) { - // Interpret range reference in matrix context to resolve - // as array elements. Depending on parameter classification - // a scalar value (non-array context) is calculated first. - OUString aUnforcedResult; - bool bForceMatrix = (!m_xBtnMatrix->get_active() && - (_pToken->GetType() == svDoubleRef || _pToken->GetType() == svExternalDoubleRef)); - if (bForceMatrix && pFuncToken) + formula::ParamClass eParamClass = ParamClass::Reference; + if (pFuncToken->IsInForceArray()) + eParamClass = ParamClass::ForceArray; + else { - formula::ParamClass eParamClass = ParamClass::Reference; - if (pFuncToken->IsInForceArray()) - eParamClass = ParamClass::ForceArray; - else - { - std::shared_ptr pCompiler = m_pHelper->getCompiler(); - if (pCompiler) - eParamClass = pCompiler->GetForceArrayParameter( pFuncToken, Count - 1); - } - switch (eParamClass) - { - case ParamClass::Unknown: - case ParamClass::Bounds: - case ParamClass::Value: - if (CalcValue( "=" + aResult, aUnforcedResult, false) && aUnforcedResult != aResult) - aUnforcedResult += " "; - else - aUnforcedResult.clear(); - break; - case ParamClass::Reference: - case ParamClass::ReferenceOrRefArray: - case ParamClass::Array: - case ParamClass::ForceArray: - case ParamClass::ReferenceOrForceArray: - case ParamClass::SuppressedReferenceOrForceArray: - case ParamClass::ForceArrayReturn: - ; // nothing, only as array/matrix - // no default to get compiler warning - } + std::shared_ptr pCompiler = m_pHelper->getCompiler(); + if (pCompiler) + eParamClass = pCompiler->GetForceArrayParameter( pFuncToken, Count - 1); } - OUString aCellResult; - if (CalcValue( "=" + aResult, aCellResult, bForceMatrix) && aCellResult != aResult) + switch (eParamClass) { - // Cell is a formula, print subformula. - // With scalar values prints "A1:A3 = 2 {1;2;3}" - _pTree->InsertEntry( aResult + " = " + aUnforcedResult + aCellResult, - pParent, STRUCT_END, 0, _pToken, *xEntry); + case ParamClass::Unknown: + case ParamClass::Bounds: + case ParamClass::Value: + if (CalcValue( "=" + aResult, aUnforcedResult, false) && aUnforcedResult != aResult) + aUnforcedResult += " "; + else + aUnforcedResult.clear(); + break; + case ParamClass::Reference: + case ParamClass::ReferenceOrRefArray: + case ParamClass::Array: + case ParamClass::ForceArray: + case ParamClass::ReferenceOrForceArray: + case ParamClass::SuppressedReferenceOrForceArray: + case ParamClass::ForceArrayReturn: + ; // nothing, only as array/matrix + // no default to get compiler warning } - else - _pTree->InsertEntry(aResult, pParent, STRUCT_END, 0, _pToken, *xEntry); } - else + OUString aCellResult; + if (CalcValue( "=" + aResult, aCellResult, bForceMatrix) && aCellResult != aResult) { - _pTree->InsertEntry(aResult, pParent, STRUCT_END, 0, _pToken, *xEntry); + // Cell is a formula, print subformula. + // With scalar values prints "A1:A3 = 2 {1;2;3}" + _pTree->InsertEntry( aResult + " = " + aUnforcedResult + aCellResult, + pParent, STRUCT_END, 0, _pToken, *xEntry); } - --Count; - MakeTree( _pTree, pParent, _pToken, m_pTokenArrayIterator->PrevRPN(), Count); + else + _pTree->InsertEntry(aResult, pParent, STRUCT_END, 0, _pToken, *xEntry); } + else + { + _pTree->InsertEntry(aResult, pParent, STRUCT_END, 0, _pToken, *xEntry); + } + --Count; + MakeTree( _pTree, pParent, _pToken, m_pTokenArrayIterator->PrevRPN(), Count); } - catch (const uno::Exception&) - { - DBG_UNHANDLED_EXCEPTION("formula.ui"); - } + } + catch (const uno::Exception&) + { + DBG_UNHANDLED_EXCEPTION("formula.ui"); } } @@ -1222,64 +1222,64 @@ OUString FormulaDlg_Impl::GetPrevFuncExpression( bool bStartFromEnd ) void FormulaDlg_Impl::SaveArg( sal_uInt16 nEd ) { - if (nEd < m_nArgs) + if (nEd >= m_nArgs) + return; + + for (sal_uInt16 i = 0; i <= nEd; i++) { - for (sal_uInt16 i = 0; i <= nEd; i++) - { - if ( m_aArguments[i].isEmpty() ) - m_aArguments[i] = " "; - } - if (!m_xParaWin->GetArgument(nEd).isEmpty()) - m_aArguments[nEd] = m_xParaWin->GetArgument(nEd); + if ( m_aArguments[i].isEmpty() ) + m_aArguments[i] = " "; + } + if (!m_xParaWin->GetArgument(nEd).isEmpty()) + m_aArguments[nEd] = m_xParaWin->GetArgument(nEd); - sal_uInt16 nClearPos = nEd+1; - for (sal_Int32 i = nEd+1; i < m_nArgs; i++) + sal_uInt16 nClearPos = nEd+1; + for (sal_Int32 i = nEd+1; i < m_nArgs; i++) + { + if ( !m_xParaWin->GetArgument(i).isEmpty() ) { - if ( !m_xParaWin->GetArgument(i).isEmpty() ) - { - nClearPos = i+1; - } + nClearPos = i+1; } + } - for (sal_Int32 i = nClearPos; i < m_nArgs; i++) - { - m_aArguments[i].clear(); - } + for (sal_Int32 i = nClearPos; i < m_nArgs; i++) + { + m_aArguments[i].clear(); } } IMPL_LINK( FormulaDlg_Impl, FxHdl, ParaWin&, rPtr, void ) { - if (&rPtr == m_xParaWin.get()) - { - m_xBtnForward->set_sensitive(true); //@ In order to be able to input another function. - m_xTabCtrl->set_current_page("function"); + if (&rPtr != m_xParaWin.get()) + return; - OUString aUndoStr = m_pHelper->getCurrentFormula(); // it will be added before a ";" - FormEditData* pData = m_pHelper->getFormEditData(); - if (!pData) - return; + m_xBtnForward->set_sensitive(true); //@ In order to be able to input another function. + m_xTabCtrl->set_current_page("function"); - sal_uInt16 nArgNo = m_xParaWin->GetActiveLine(); - sal_uInt16 nEdFocus = nArgNo; + OUString aUndoStr = m_pHelper->getCurrentFormula(); // it will be added before a ";" + FormEditData* pData = m_pHelper->getFormEditData(); + if (!pData) + return; - SaveArg(nArgNo); - UpdateSelection(); + sal_uInt16 nArgNo = m_xParaWin->GetActiveLine(); + sal_uInt16 nEdFocus = nArgNo; - sal_Int32 nFormulaStrPos = pData->GetFStart(); + SaveArg(nArgNo); + UpdateSelection(); - OUString aFormula = m_pHelper->getCurrentFormula(); - sal_Int32 n1 = m_aFormulaHelper.GetArgStart( aFormula, nFormulaStrPos, nEdFocus + pData->GetOffset() ); + sal_Int32 nFormulaStrPos = pData->GetFStart(); - pData->SaveValues(); - pData->SetMode( FormulaDlgMode::Formula ); - pData->SetFStart( n1 ); - pData->SetUndoStr( aUndoStr ); - ClearAllParas(); + OUString aFormula = m_pHelper->getCurrentFormula(); + sal_Int32 n1 = m_aFormulaHelper.GetArgStart( aFormula, nFormulaStrPos, nEdFocus + pData->GetOffset() ); - FillDialog(false); - m_xFuncPage->SetFocus(); //There Parawin is not visible anymore - } + pData->SaveValues(); + pData->SetMode( FormulaDlgMode::Formula ); + pData->SetFStart( n1 ); + pData->SetUndoStr( aUndoStr ); + ClearAllParas(); + + FillDialog(false); + m_xFuncPage->SetFocus(); //There Parawin is not visible anymore } IMPL_LINK( FormulaDlg_Impl, ModifyHdl, ParaWin&, rPtr, void ) @@ -1528,43 +1528,43 @@ void FormulaDlg_Impl::RefInputStartAfter() { m_xRefBtn->SetEndImage(); - if (m_pTheRefEdit) - { - OUString aStr = m_aTitle2 + " " + m_xFtEditName->get_label() + "( "; + if (!m_pTheRefEdit) + return; - if ( m_xParaWin->GetActiveLine() > 0 ) - aStr += "...; "; - aStr += m_xParaWin->GetActiveArgName(); - if ( m_xParaWin->GetActiveLine() + 1 < m_nArgs ) - aStr += "; ..."; - aStr += " )"; + OUString aStr = m_aTitle2 + " " + m_xFtEditName->get_label() + "( "; - m_rDialog.set_title(m_rDialog.strip_mnemonic(aStr)); - } + if ( m_xParaWin->GetActiveLine() > 0 ) + aStr += "...; "; + aStr += m_xParaWin->GetActiveArgName(); + if ( m_xParaWin->GetActiveLine() + 1 < m_nArgs ) + aStr += "; ..."; + aStr += " )"; + + m_rDialog.set_title(m_rDialog.strip_mnemonic(aStr)); } void FormulaDlg_Impl::RefInputDoneAfter( bool bForced ) { m_xRefBtn->SetStartImage(); - if (bForced || !m_xRefBtn->GetWidget()->get_visible()) + if (!(bForced || !m_xRefBtn->GetWidget()->get_visible())) + return; + + m_xEdRef->GetWidget()->hide(); + m_xRefBtn->GetWidget()->hide(); + if ( m_pTheRefEdit ) { - m_xEdRef->GetWidget()->hide(); - m_xRefBtn->GetWidget()->hide(); - if ( m_pTheRefEdit ) - { - m_pTheRefEdit->SetRefString( m_xEdRef->GetText() ); - m_pTheRefEdit->GrabFocus(); + m_pTheRefEdit->SetRefString( m_xEdRef->GetText() ); + m_pTheRefEdit->GrabFocus(); - if ( m_pTheRefButton ) - m_pTheRefButton->SetStartImage(); + if ( m_pTheRefButton ) + m_pTheRefButton->SetStartImage(); - sal_uInt16 nPrivActiv = m_xParaWin->GetActiveLine(); - m_xParaWin->SetArgument( nPrivActiv, m_xEdRef->GetText() ); - ModifyHdl( *m_xParaWin ); - m_pTheRefEdit = nullptr; - } - m_rDialog.set_title(m_aTitle1); + sal_uInt16 nPrivActiv = m_xParaWin->GetActiveLine(); + m_xParaWin->SetArgument( nPrivActiv, m_xEdRef->GetText() ); + ModifyHdl( *m_xParaWin ); + m_pTheRefEdit = nullptr; } + m_rDialog.set_title(m_aTitle1); } RefEdit* FormulaDlg_Impl::GetCurrRefEdit() diff --git a/formula/source/ui/dlg/parawin.cxx b/formula/source/ui/dlg/parawin.cxx index d3c4de1b7554..ceb50d8d7e6d 100644 --- a/formula/source/ui/dlg/parawin.cxx +++ b/formula/source/ui/dlg/parawin.cxx @@ -108,55 +108,55 @@ void ParaWin::UpdateArgDesc( sal_uInt16 nArg ) if (nMaxArgs > 4) nArg = sal::static_int_cast( nArg + GetSliderPos() ); - if ((nMaxArgs > 0) && (nArg 0) && (nArggetParameterDescription(nRealArg); - aArgName = pFuncDesc->getParameterName(nRealArg) + " " + - ((pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired); - } - else if ( nArgs < PAIRED_VAR_ARGS ) - { - sal_uInt16 nFix = nArgs - VAR_ARGS; - sal_uInt16 nPos = std::min( nArg, nFix ); - sal_uInt16 nRealArg = (nPos < aVisibleArgMapping.size() ? - aVisibleArgMapping[nPos] : aVisibleArgMapping.back()); - aArgDesc = pFuncDesc->getParameterDescription(nRealArg); - aArgName = pFuncDesc->getParameterName(nRealArg); - sal_uInt16 nVarArgsStart = pFuncDesc->getVarArgsStart(); - if ( nArg >= nVarArgsStart ) - aArgName += OUString::number( nArg-nVarArgsStart+1 ); - aArgName += " " + ((nArg > nFix || pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired) ; - } - else - { - sal_uInt16 nFix = nArgs - PAIRED_VAR_ARGS; - sal_uInt16 nPos; - if ( nArg < nFix ) - nPos = nArg; - else - nPos = nFix + ( (nArg-nFix) % 2); - sal_uInt16 nRealArg = (nPos < aVisibleArgMapping.size() ? - aVisibleArgMapping[nPos] : aVisibleArgMapping.back()); - aArgDesc = pFuncDesc->getParameterDescription(nRealArg); - aArgName = pFuncDesc->getParameterName(nRealArg); - sal_uInt16 nVarArgsStart = pFuncDesc->getVarArgsStart(); - if ( nArg >= nVarArgsStart ) - aArgName += OUString::number( (nArg-nVarArgsStart)/2 + 1 ); - aArgName += " " + ((nArg > (nFix+1) || pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired) ; - } + SetArgumentDesc( OUString() ); + SetArgumentText( OUString() ); - SetArgumentDesc(aArgDesc); - SetArgumentText(aArgName); + if ( nArgs < VAR_ARGS ) + { + sal_uInt16 nRealArg = (nArg < aVisibleArgMapping.size()) ? aVisibleArgMapping[nArg] : nArg; + aArgDesc = pFuncDesc->getParameterDescription(nRealArg); + aArgName = pFuncDesc->getParameterName(nRealArg) + " " + + ((pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired); + } + else if ( nArgs < PAIRED_VAR_ARGS ) + { + sal_uInt16 nFix = nArgs - VAR_ARGS; + sal_uInt16 nPos = std::min( nArg, nFix ); + sal_uInt16 nRealArg = (nPos < aVisibleArgMapping.size() ? + aVisibleArgMapping[nPos] : aVisibleArgMapping.back()); + aArgDesc = pFuncDesc->getParameterDescription(nRealArg); + aArgName = pFuncDesc->getParameterName(nRealArg); + sal_uInt16 nVarArgsStart = pFuncDesc->getVarArgsStart(); + if ( nArg >= nVarArgsStart ) + aArgName += OUString::number( nArg-nVarArgsStart+1 ); + aArgName += " " + ((nArg > nFix || pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired) ; } + else + { + sal_uInt16 nFix = nArgs - PAIRED_VAR_ARGS; + sal_uInt16 nPos; + if ( nArg < nFix ) + nPos = nArg; + else + nPos = nFix + ( (nArg-nFix) % 2); + sal_uInt16 nRealArg = (nPos < aVisibleArgMapping.size() ? + aVisibleArgMapping[nPos] : aVisibleArgMapping.back()); + aArgDesc = pFuncDesc->getParameterDescription(nRealArg); + aArgName = pFuncDesc->getParameterName(nRealArg); + sal_uInt16 nVarArgsStart = pFuncDesc->getVarArgsStart(); + if ( nArg >= nVarArgsStart ) + aArgName += OUString::number( (nArg-nVarArgsStart)/2 + 1 ); + aArgName += " " + ((nArg > (nFix+1) || pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired) ; + } + + SetArgumentDesc(aArgDesc); + SetArgumentText(aArgName); } void ParaWin::UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 i ) @@ -234,20 +234,20 @@ ParaWin::~ParaWin() void ParaWin::SetActiveLine(sal_uInt16 no) { - if (no < nMaxArgs) + if (no >= nMaxArgs) + return; + + long nOffset = GetSliderPos(); + nActiveLine=no; + long nNewEdPos=static_cast(nActiveLine)-nOffset; + if(nNewEdPos<0 || nNewEdPos>3) { - long nOffset = GetSliderPos(); - nActiveLine=no; - long nNewEdPos=static_cast(nActiveLine)-nOffset; - if(nNewEdPos<0 || nNewEdPos>3) - { - nOffset+=nNewEdPos; - SetSliderPos(static_cast(nOffset)); - nOffset=GetSliderPos(); - } - nEdFocus=no-static_cast(nOffset); - UpdateArgDesc( nEdFocus ); + nOffset+=nNewEdPos; + SetSliderPos(static_cast(nOffset)); + nOffset=GetSliderPos(); } + nEdFocus=no-static_cast(nOffset); + UpdateArgDesc( nEdFocus ); } RefEdit* ParaWin::GetActiveEdit() diff --git a/formula/source/ui/dlg/structpg.cxx b/formula/source/ui/dlg/structpg.cxx index 432f2a9bdd5b..0f5fd9417732 100644 --- a/formula/source/ui/dlg/structpg.cxx +++ b/formula/source/ui/dlg/structpg.cxx @@ -127,26 +127,26 @@ const FormulaToken* StructPage::GetFunctionEntry(const weld::TreeIter* pEntry) IMPL_LINK(StructPage, SelectHdl, weld::TreeView&, rTlb, void) { - if (GetActiveFlag()) + if (!GetActiveFlag()) + return; + + if (&rTlb == m_xTlbStruct.get()) { - if (&rTlb == m_xTlbStruct.get()) + std::unique_ptr xCurEntry(m_xTlbStruct->make_iterator()); + if (m_xTlbStruct->get_cursor(xCurEntry.get())) { - std::unique_ptr xCurEntry(m_xTlbStruct->make_iterator()); - if (m_xTlbStruct->get_cursor(xCurEntry.get())) + pSelectedToken = reinterpret_cast(m_xTlbStruct->get_id(*xCurEntry).toInt64()); + if (pSelectedToken) { - pSelectedToken = reinterpret_cast(m_xTlbStruct->get_id(*xCurEntry).toInt64()); - if (pSelectedToken) + if ( !(pSelectedToken->IsFunction() || pSelectedToken->GetParamCount() > 1) ) { - if ( !(pSelectedToken->IsFunction() || pSelectedToken->GetParamCount() > 1) ) - { - pSelectedToken = GetFunctionEntry(xCurEntry.get()); - } + pSelectedToken = GetFunctionEntry(xCurEntry.get()); } } } - - aSelLink.Call(*this); } + + aSelLink.Call(*this); } } // formula -- cgit