formula/source/ui/dlg/formula.cxx | 50 +++++++++++++++++++++++++++--- formula/source/ui/dlg/structpg.hxx | 2 + sc/inc/simpleformulacalc.hxx | 3 + sc/qa/unit/ucalc.cxx | 29 +++++++++-------- sc/source/core/data/simpleformulacalc.cxx | 23 +++++++++++++ sc/source/ui/formdlg/formula.cxx | 2 + 6 files changed, 92 insertions(+), 17 deletions(-)
New commits: commit 774085dbe5c332f2be757f5f6a0324280dd72651 Author: Benjamin Ni <benjaminn...@hotmail.com> Date: Mon Jul 27 19:59:28 2015 +0200 tdf#92548, limit number of characters shown in formula wizard Change-Id: I5c322140d40e1ec31e8664a6f731e57b9b3defdb diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx index 90dfb5b..7399e06 100644 --- a/formula/source/ui/dlg/formula.cxx +++ b/formula/source/ui/dlg/formula.cxx @@ -723,7 +723,7 @@ void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,Fo const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() ); if(pDesc==pFuncDesc || !pFuncPage->IsVisible()) { -// EditNextFunc(false); + EditNextFunc(false); } } diff --git a/sc/inc/simpleformulacalc.hxx b/sc/inc/simpleformulacalc.hxx index 2d20f6d..f12e261 100644 --- a/sc/inc/simpleformulacalc.hxx +++ b/sc/inc/simpleformulacalc.hxx @@ -33,6 +33,7 @@ private: formula::FormulaGrammar::Grammar maGram; bool bIsMatrix; OUString maMatrixFormulaResult; + bool mbLimitString; public: ScSimpleFormulaCalculator(ScDocument* pDoc, const ScAddress& rAddr, @@ -50,6 +51,8 @@ public: bool HasColRowName(); ScTokenArray* GetCode(); + + void SetLimitString(bool bLimitString); }; #endif diff --git a/sc/source/core/data/simpleformulacalc.cxx b/sc/source/core/data/simpleformulacalc.cxx index d359667..a931551 100644 --- a/sc/source/core/data/simpleformulacalc.cxx +++ b/sc/source/core/data/simpleformulacalc.cxx @@ -13,6 +13,8 @@ #include "interpre.hxx" #include "compiler.hxx" +#define DISPLAY_LEN 15 + ScSimpleFormulaCalculator::ScSimpleFormulaCalculator( ScDocument* pDoc, const ScAddress& rAddr, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram ) : mnFormatType(0) @@ -22,6 +24,7 @@ ScSimpleFormulaCalculator::ScSimpleFormulaCalculator( ScDocument* pDoc, const Sc , mpDoc(pDoc) , maGram(eGram) , bIsMatrix(false) + , mbLimitString(false) { // compile already here ScCompiler aComp(mpDoc, maAddr); @@ -53,6 +56,21 @@ void ScSimpleFormulaCalculator::Calculate() aComp.CreateStringFromToken(aStr, aInt.GetResultToken().get(), false); bIsMatrix = true; + + if (mbLimitString) + { + size_t n = aStr.getLength(); + for (size_t i = DISPLAY_LEN; i < n; ++i) + { + if (aStr[i] == ',' || aStr[i] == ';') + { + aStr.truncate(i); + aStr.append("..."); + break; + } + } + } + maMatrixFormulaResult = aStr.makeStringAndClear(); } mnFormatType = aInt.GetRetFormatType(); @@ -121,4 +139,9 @@ ScTokenArray* ScSimpleFormulaCalculator::GetCode() return mpCode.get(); } +void ScSimpleFormulaCalculator::SetLimitString(bool bLimitString) +{ + mbLimitString = bLimitString; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/formdlg/formula.cxx b/sc/source/ui/formdlg/formula.cxx index 4160619..d6c1b17 100644 --- a/sc/source/ui/formdlg/formula.cxx +++ b/sc/source/ui/formdlg/formula.cxx @@ -308,6 +308,7 @@ bool ScFormulaDlg::Close() bool ScFormulaDlg::calculateValue( const OUString& rStrExp, OUString& rStrResult ) { boost::scoped_ptr<ScSimpleFormulaCalculator> pFCell( new ScSimpleFormulaCalculator( pDoc, aCursorPos, rStrExp ) ); + pFCell->SetLimitString(true); // HACK! to avoid neither #REF! from ColRowNames // if a name is added as actually range in the overall formula, @@ -324,6 +325,7 @@ bool ScFormulaDlg::calculateValue( const OUString& rStrExp, OUString& rStrResult aBraced.append(rStrExp); aBraced.append(')'); pFCell.reset( new ScSimpleFormulaCalculator( pDoc, aCursorPos, aBraced.makeStringAndClear() ) ); + pFCell->SetLimitString(true); } else bColRowName = false; commit f82d89f35207fc1cfc00ad5cd914b74c55c3e3d2 Author: Benjamin Ni <benjaminn...@hotmail.com> Date: Sun Jul 12 15:41:55 2015 +0100 tdf#92546 show results for sub-expressions in formula wizard Change-Id: I1d5ba707d8dce69abc15ec1de7bec4728bd93adb diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx index 8581e8f..90dfb5b 100644 --- a/formula/source/ui/dlg/formula.cxx +++ b/formula/source/ui/dlg/formula.cxx @@ -90,7 +90,7 @@ namespace formula void UpdateTokenArray( const OUString& rStrExp); OUString RepairFormula(const OUString& aFormula); void FillDialog(bool nFlag=true); - void EditNextFunc( bool bForward, sal_Int32 nFStart=NOT_FOUND ); + bool EditNextFunc( bool bForward, sal_Int32 nFStart=NOT_FOUND ); void EditThisFunc(sal_Int32 nFStart); void StoreFormEditData(FormEditData* pEditData); @@ -198,6 +198,7 @@ namespace formula OString aOldUnique; OString aActivWinId; bool bIsShutDown; + bool bMakingTree; //in method of constructing tree vcl::Font aFntBold; vcl::Font aFntLight; @@ -243,6 +244,7 @@ FormulaDlg_Impl::FormulaDlg_Impl(Dialog* pParent aTxtEnd ( ModuleRes( STR_END ) ), m_aFormulaHelper(_pFunctionMgr), bIsShutDown (false), + bMakingTree (false), nEdFocus (0), pFuncDesc (NULL), nArgs (0) @@ -600,6 +602,8 @@ void FormulaDlg_Impl::UpdateValues() if ( CalcValue( pFuncDesc->getFormula( m_aArguments ), aStrResult ) ) m_pWndResult->SetText( aStrResult ); + if (bMakingTree) return; + aStrResult.clear(); if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) ) m_pWndFormResult->SetText( aStrResult ); @@ -674,6 +678,7 @@ void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,Fo { SvTreeListEntry* pEntry; + bool bCalcSubformula = false; OUString aTest=_pTree->GetEntryText(pParent); if(aTest==aResult && @@ -688,6 +693,12 @@ void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,Fo { pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken); } + + else if ( eOp<ocAdd || eOp>ocNegSub ) // not ideal coding + { + bCalcSubformula = true; + pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_FOLDER,0,_pToken); + } else { pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_FOLDER,0,_pToken); @@ -695,6 +706,33 @@ void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,Fo } MakeTree(_pTree,pEntry,m_pTokenArray->PrevRPN(),nParas); + + if (bCalcSubformula) + { + OUString aStr; + OUString aEquals(" = "); + + if (!bMakingTree) + { // gets the last subformula result + bMakingTree = true; + EditThisFunc(0); + while ( EditNextFunc(true) ) {} + } + else + { // gets subsequent subformula results (from the back) + const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() ); + if(pDesc==pFuncDesc || !pFuncPage->IsVisible()) + { +// EditNextFunc(false); + } + } + + if ( CalcValue( pFuncDesc->getFormula( m_aArguments ), aStr ) ) + m_pWndResult->SetText( aStr ); + aStr = m_pWndResult->GetText(); + pStructPage->GetTlbStruct()->SetEntryText(pEntry,aResult + aEquals + aStr); + } + --Count; m_pTokenArray->NextRPN(); MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count); @@ -709,7 +747,8 @@ void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,Fo { OUString aCellResult; OUString aEquals(" = "); - if (CalcValue( "=" + aResult, aCellResult) && aCellResult != aResult) // cell is a formula, print subformula + CalcValue( "=" + aResult, aCellResult); + if (aCellResult != aResult) // cell is a formula, print subformula _pTree->InsertEntry(aResult + aEquals + aCellResult,pParent,STRUCT_END,0,_pToken); else _pTree->InsertEntry(aResult,pParent,STRUCT_END,0,_pToken); @@ -737,6 +776,7 @@ void FormulaDlg_Impl::fillTree(IStructHelper* _pTree) if( pToken != NULL) { MakeTree(_pTree,NULL,pToken,1); + bMakingTree = false; } } void FormulaDlg_Impl::UpdateTokenArray( const OUString& rStrExp) @@ -1136,11 +1176,11 @@ void FormulaDlg_Impl::EditThisFunc(sal_Int32 nFStart) } } -void FormulaDlg_Impl::EditNextFunc( bool bForward, sal_Int32 nFStart ) +bool FormulaDlg_Impl::EditNextFunc( bool bForward, sal_Int32 nFStart ) { FormEditData* pData = m_pHelper->getFormEditData(); if (!pData) - return; + return false; OUString aFormula = m_pHelper->getCurrentFormula(); @@ -1173,6 +1213,8 @@ void FormulaDlg_Impl::EditNextFunc( bool bForward, sal_Int32 nFStart ) sal_Int32 PrivStart, PrivEnd; SetData(nFStart, nNextFStart, nNextFEnd, PrivStart, PrivEnd); } + + return bFound; } void FormulaDlg_Impl::SaveArg( sal_uInt16 nEd ) diff --git a/formula/source/ui/dlg/structpg.hxx b/formula/source/ui/dlg/structpg.hxx index cd0bf60..4305365 100644 --- a/formula/source/ui/dlg/structpg.hxx +++ b/formula/source/ui/dlg/structpg.hxx @@ -100,6 +100,8 @@ public: virtual OUString GetEntryText(SvTreeListEntry* pEntry) const SAL_OVERRIDE; void SetSelectionHdl( const Link<>& rLink ) { aSelLink = rLink; } + + StructListBox* GetTlbStruct() const { return m_pTlbStruct; } }; } // formula commit 3cb68ecffa507eb839552e3d55369faf915fae81 Author: Benjamin Ni <benjaminn...@hotmail.com> Date: Mon Jul 27 19:33:24 2015 +0200 fix test for tdf#92547 Change-Id: Ifa4b338f067bd398c0e4d0e533980a255484dc90 diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index dcdc40d..99f5bb9 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -6514,19 +6514,22 @@ void Test::testFormulaWizardSubformula() { m_pDoc->InsertTab(0, "Test"); - m_pDoc->SetString(ScAddress(0,0,0), "=B0:B2"); - m_pDoc->SetString(ScAddress(0,1,0), "=1"); // B0 - m_pDoc->SetString(ScAddress(1,1,0), "=1/0"); // B1 - m_pDoc->SetString(ScAddress(2,1,0), "=gibberish"); // B2 - ScSimpleFormulaCalculator aFCell( m_pDoc, ScAddress(0,0,0), "" ); - if ( aFCell.GetErrCode() == 0 ) - CPPUNIT_ASSERT_EQUAL( OUString("{1, #DIV/0!, #NAME!}"), aFCell.GetString().getString() ); - - m_pDoc->SetString(ScAddress(0,1,0), "=NA()"); // B0 - m_pDoc->SetString(ScAddress(1,1,0), "2"); // B1 - m_pDoc->SetString(ScAddress(2,1,0), "=1+2"); // B2 - if ( aFCell.GetErrCode() == 0 ) - CPPUNIT_ASSERT_EQUAL(OUString("{#N/A, 2, 3}"), aFCell.GetString().getString()); + m_pDoc->SetString(ScAddress(1,0,0), "=1"); // B1 + m_pDoc->SetString(ScAddress(1,1,0), "=1/0"); // B2 + m_pDoc->SetString(ScAddress(1,2,0), "=gibberish"); // B3 + + ScSimpleFormulaCalculator pFCell1( m_pDoc, ScAddress(0,0,0), "=B1:B3" ); + sal_uInt16 nErrCode = pFCell1.GetErrCode(); + CPPUNIT_ASSERT( nErrCode == 0 || pFCell1.IsMatrix() ); + CPPUNIT_ASSERT_EQUAL( OUString("{1;#DIV/0!;#NAME?}"), pFCell1.GetString().getString() ); + + m_pDoc->SetString(ScAddress(1,0,0), "=NA()"); // B1 + m_pDoc->SetString(ScAddress(1,1,0), "2"); // B2 + m_pDoc->SetString(ScAddress(1,2,0), "=1+2"); // B3 + ScSimpleFormulaCalculator pFCell2( m_pDoc, ScAddress(0,0,0), "=B1:B3" ); + nErrCode = pFCell2.GetErrCode(); + CPPUNIT_ASSERT( nErrCode == 0 || pFCell2.IsMatrix() ); + CPPUNIT_ASSERT_EQUAL( OUString("{#N/A;2;3}"), pFCell2.GetString().getString() ); m_pDoc->DeleteTab(0); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits