diff options
author | Eike Rathke <erack@redhat.com> | 2015-12-18 23:22:24 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-12-18 23:28:14 +0100 |
commit | dc89367a5622748dd7c37b89ac300a663b8b98e9 (patch) | |
tree | 07cea3163e2e9a300afda171fa4a7aed793dd153 /formula | |
parent | fe88326d35579f2c88efe96a45911affa9c9f174 (diff) |
Formula Wizard: evaluating expressions always in matrix context is wrong
Change-Id: I276f7bbf2bd6fa7c67d8691634ad9d79e4a08b1c
Diffstat (limited to 'formula')
-rw-r--r-- | formula/source/ui/dlg/formula.cxx | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx index bb4f46d26f31..0d0a6462ea0c 100644 --- a/formula/source/ui/dlg/formula.cxx +++ b/formula/source/ui/dlg/formula.cxx @@ -77,9 +77,9 @@ public: RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ); void RefInputStartAfter( RefEdit* pEdit, RefButton* pButton ); void RefInputDoneAfter( bool bForced ); - bool CalcValue( const OUString& rStrExp, OUString& rStrResult ); - bool CalcStruct( const OUString& rStrExp); - void UpdateValues(); + bool CalcValue( const OUString& rStrExp, OUString& rStrResult, bool bForceMatrixFormula = false ); + bool CalcStruct( const OUString& rStrExp, bool bForceRecalcStruct = false ); + void UpdateValues( bool bForceRecalcStruct = false ); void DeleteArgs(); sal_Int32 GetFunctionPos(sal_Int32 nPos); void ClearAllParas(); @@ -568,7 +568,7 @@ sal_Int32 FormulaDlg_Impl::GetFunctionPos(sal_Int32 nPos) return nFuncPos; } -bool FormulaDlg_Impl::CalcValue( const OUString& rStrExp, OUString& rStrResult ) +bool FormulaDlg_Impl::CalcValue( const OUString& rStrExp, OUString& rStrResult, bool bForceMatrixFormula ) { bool bResult = true; @@ -578,7 +578,7 @@ bool FormulaDlg_Impl::CalcValue( const OUString& rStrExp, OUString& rStrResult ) if ( !Application::AnyInput( VclInputFlags::KEYBOARD ) ) { - bResult = m_pHelper->calculateValue(rStrExp,rStrResult); + bResult = m_pHelper->calculateValue( rStrExp, rStrResult, bForceMatrixFormula || m_pBtnMatrix->IsChecked()); } else bResult = false; @@ -587,7 +587,7 @@ bool FormulaDlg_Impl::CalcValue( const OUString& rStrExp, OUString& rStrResult ) return bResult; } -void FormulaDlg_Impl::UpdateValues() +void FormulaDlg_Impl::UpdateValues( bool bForceRecalcStruct ) { OUString aStrResult; if ( CalcValue( pFuncDesc->getFormula( m_aArguments ), aStrResult ) ) @@ -603,15 +603,15 @@ void FormulaDlg_Impl::UpdateValues() aStrResult.clear(); m_pWndFormResult->SetText( aStrResult ); } - CalcStruct(pMEdit->GetText()); + CalcStruct( pMEdit->GetText(), bForceRecalcStruct); } -bool FormulaDlg_Impl::CalcStruct( const OUString& rStrExp) +bool FormulaDlg_Impl::CalcStruct( const OUString& rStrExp, bool bForceRecalcStruct ) { bool bResult = true; sal_Int32 nLength = rStrExp.getLength(); - if ( !rStrExp.isEmpty() && aOldFormula!=rStrExp && bStructUpdate) + if ( !rStrExp.isEmpty() && (bForceRecalcStruct || aOldFormula != rStrExp) && bStructUpdate) { // Only calculate the value when there isn't any more keyboard input: @@ -733,10 +733,17 @@ void FormulaDlg_Impl::MakeTree(StructPage* _pTree,SvTreeListEntry* pParent,Formu } else if (eOp==ocPush) { + // Interpret range reference in matrix context to resolve + // as array elements. + /* TODO: this should depend on parameter classification, if + * a scalar value is expected matrix should not be forced. + * */ + bool bForceMatrix = (!m_pBtnMatrix->IsChecked() && + (_pToken->GetType() == svDoubleRef || _pToken->GetType() == svExternalDoubleRef)); OUString aCellResult; - OUString aEquals(" = "); - if (CalcValue( "=" + aResult, aCellResult) && aCellResult != aResult) // cell is a formula, print subformula - _pTree->InsertEntry(aResult + aEquals + aCellResult,pParent,STRUCT_END,0,_pToken); + if (CalcValue( "=" + aResult, aCellResult, bForceMatrix) && aCellResult != aResult) + // Cell is a formula, print subformula. + _pTree->InsertEntry(aResult + " = " + aCellResult, pParent,STRUCT_END,0,_pToken); else _pTree->InsertEntry(aResult,pParent,STRUCT_END,0,_pToken); } @@ -1607,6 +1614,7 @@ IMPL_LINK_NOARG_TYPED(FormulaDlg_Impl, StructSelHdl, StructPage&, void) IMPL_LINK_NOARG_TYPED(FormulaDlg_Impl, MatrixHdl, Button*, void) { bUserMatrixFlag=true; + UpdateValues(true); } IMPL_LINK_NOARG_TYPED(FormulaDlg_Impl, FuncSelHdl, FuncPage&, void) |