diff options
author | Rafael Lima <rafael.palma.lima@gmail.com> | 2024-06-11 11:19:40 -0300 |
---|---|---|
committer | Rafael Lima <rafael.palma.lima@gmail.com> | 2024-06-13 01:46:50 +0200 |
commit | daedc81fa22690ce1a08b477a52360f05e4f5ed9 (patch) | |
tree | 3bd2fc20f8bb6ec81d809b5659a095f1789d33aa | |
parent | 95dd795e7510e62e9fc316e5ac8c1057b58a8f4e (diff) |
tdf#161462 Remember Goal Seek settings
Each time the user opens the Goal Seek dialogs, all settings are reset. This patch makes these settings be remembered during the same session.
Change-Id: I60a121b4001f4666ee25ab807fdc3860cf798296
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168683
Tested-by: Jenkins
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
-rw-r--r-- | sc/inc/document.hxx | 21 | ||||
-rw-r--r-- | sc/source/ui/miscdlgs/solvrdlg.cxx | 24 |
2 files changed, 41 insertions, 4 deletions
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 4dbce67d2928..cc714491e6d9 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -319,6 +319,15 @@ enum ScMutationGuardFlags CORE = 0x0001, /// Core calc data structures should not be mutated }; +// Stores settings used in the Goal Seek +struct ScGoalSeekSettings +{ + bool bDefined = false; + ScAddress aFormulaCell; + ScAddress aVariableCell; + OUString sTargetValue; +}; + typedef std::unique_ptr<ScTable, o3tl::default_delete<ScTable>> ScTableUniquePtr; class ScDocument @@ -453,6 +462,9 @@ private: css::uno::Reference< css::script::vba::XVBAEventProcessor > mxVbaEvents; + + // Stores Goal Seek settings + ScGoalSeekSettings maGoalSeekSettings; public: /// list of ScInterpreterTableOpParams currently in use std::vector<ScInterpreterTableOpParams*> m_TableOpList; @@ -1967,9 +1979,12 @@ public: void GetSearchAndReplaceStart( const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow ); - bool Solver( SCCOL nFCol, SCROW nFRow, SCTAB nFTab, - SCCOL nVCol, SCROW nVRow, SCTAB nVTab, - const OUString& sValStr, double& nX); + // Goal Seek solver + bool Solver( SCCOL nFCol, SCROW nFRow, SCTAB nFTab, + SCCOL nVCol, SCROW nVRow, SCTAB nVTab, + const OUString& sValStr, double& nX); + ScGoalSeekSettings GetGoalSeekSettings() { return maGoalSeekSettings; } + void SetGoalSeekSettings(ScGoalSeekSettings aNewSettings) { maGoalSeekSettings = aNewSettings; } SC_DLLPUBLIC void ApplySelectionPattern( const ScPatternAttr& rAttr, const ScMarkData& rMark, ScEditDataArray* pDataArray = nullptr, bool* pIsChanged = nullptr ); diff --git a/sc/source/ui/miscdlgs/solvrdlg.cxx b/sc/source/ui/miscdlgs/solvrdlg.cxx index 824f4bfad752..4f1b38f1f857 100644 --- a/sc/source/ui/miscdlgs/solvrdlg.cxx +++ b/sc/source/ui/miscdlgs/solvrdlg.cxx @@ -95,7 +95,21 @@ void ScSolverDlg::Init() OUString aStr(theFormulaCell.Format(ScRefFlags::ADDR_ABS, nullptr, pDoc->GetAddressConvention())); - m_xEdFormulaCell->SetText( aStr ); + // If Goal Seek settings are stored in the document, restore them + ScGoalSeekSettings aSettings = pDoc->GetGoalSeekSettings(); + if (aSettings.bDefined) + { + OUString sFormulaString(aSettings.aFormulaCell.Format(ScRefFlags::ADDR_ABS, nullptr, pDoc->GetAddressConvention())); + OUString sVariableString(aSettings.aVariableCell.Format(ScRefFlags::ADDR_ABS, nullptr, pDoc->GetAddressConvention())); + m_xEdFormulaCell->SetText(sFormulaString); + m_xEdVariableCell->SetText(sVariableString); + m_xEdTargetVal->set_text(aSettings.sTargetValue); + } + else + { + m_xEdFormulaCell->SetText( aStr ); + } + m_xEdFormulaCell->GrabFocus(); m_pEdActive = m_xEdFormulaCell.get(); } @@ -201,6 +215,14 @@ IMPL_LINK(ScSolverDlg, BtnHdl, weld::Button&, rBtn, void) ScRefFlags nRes1 = theFormulaCell .Parse( m_xEdFormulaCell->GetText(), *pDoc, eConv ); ScRefFlags nRes2 = theVariableCell.Parse( m_xEdVariableCell->GetText(), *pDoc, eConv ); + // Remember Goal Seek settings for the next time the dialog opens + ScGoalSeekSettings aSettings; + aSettings.bDefined = true; + aSettings.aFormulaCell = theFormulaCell; + aSettings.aVariableCell = theVariableCell; + aSettings.sTargetValue = theTargetValStr; + pDoc->SetGoalSeekSettings(aSettings); + if ( (nRes1 & ScRefFlags::VALID) == ScRefFlags::VALID ) { if ( (nRes2 & ScRefFlags::VALID) == ScRefFlags::VALID ) |