diff options
Diffstat (limited to 'formula/source/ui/dlg/formula.cxx')
-rw-r--r-- | formula/source/ui/dlg/formula.cxx | 450 |
1 files changed, 225 insertions, 225 deletions
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<sheet::FormulaToken> aArgs(1); + ::std::map<const FormulaToken*, sheet::FormulaToken>::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<sheet::FormulaToken> aArgs(1); - ::std::map<const FormulaToken*, sheet::FormulaToken>::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<weld::TreeIter> xEntry; + weld::TreeIter* pEntry; - if ( nParas > 0 || (nParas == 0 && _pToken->IsFunction()) ) - { - std::unique_ptr<weld::TreeIter> 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<weld::TreeIter> xEntry(m_xStructPage->GetTlbStruct().make_iterator()); + if (eOp == ocBad) { - std::unique_ptr<weld::TreeIter> 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<FormulaCompiler> 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<FormulaCompiler> 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() |