officecfg/registry/schema/org/openoffice/Office/Calc.xcs | 8 sc/inc/calcconfig.hxx | 1 sc/inc/formulaopt.hxx | 8 sc/source/core/tool/calcconfig.cxx | 6 sc/source/core/tool/formulaopt.cxx | 47 ++-- sc/source/core/tool/interpr4.cxx | 29 +- sc/source/ui/docshell/docsh6.cxx | 4 sc/source/ui/optdlg/calcoptionsdlg.cxx | 169 +++++++++++---- sc/source/ui/optdlg/calcoptionsdlg.hrc | 9 sc/source/ui/optdlg/calcoptionsdlg.hxx | 11 sc/source/ui/optdlg/calcoptionsdlg.src | 34 +++ sc/source/ui/optdlg/tpformula.cxx | 6 12 files changed, 261 insertions(+), 71 deletions(-)
New commits: commit 01ee7955fe6d0e25c325717fe7d5dbd56e28983c Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 23 21:32:47 2012 -0400 More helpful description for this option. Change-Id: Ib9399719d3d055c98108811cfb29dfd6f6dd9095 diff --git a/sc/source/ui/optdlg/calcoptionsdlg.src b/sc/source/ui/optdlg/calcoptionsdlg.src index 235ec0e..4c53229 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.src +++ b/sc/source/ui/optdlg/calcoptionsdlg.src @@ -125,7 +125,7 @@ ModalDialog RID_SCDLG_FORMULA_CALCOPTIONS String STR_EMPTY_STRING_AS_ZERO_DESC { - Text [ en-US ] = "Blah."; + Text [ en-US ] = "This option determines whether or not an empty string is to be treated as having a value of zero when used in arithmetic."; }; String STR_TRUE commit 9b2d4348e1659cebdf560626a3b6c00263c6b1f2 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 23 21:17:53 2012 -0400 Unused parameter. Change-Id: Ie76561a2c8e5d6a8613e948620503f42ad73a207 diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx index 3b1f8da..69bd2a8 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.cxx +++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx @@ -312,7 +312,7 @@ IMPL_LINK(ScCalcOptionsDialog, SettingsSelHdl, Control*, pCtrl) return 0; } -IMPL_LINK(ScCalcOptionsDialog, BtnToggleHdl, RadioButton*, pBtn) +IMPL_LINK_NOARG(ScCalcOptionsDialog, BtnToggleHdl) { RadioValueChanged(); return 0; diff --git a/sc/source/ui/optdlg/calcoptionsdlg.hxx b/sc/source/ui/optdlg/calcoptionsdlg.hxx index 85a62db..a1a7222 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.hxx +++ b/sc/source/ui/optdlg/calcoptionsdlg.hxx @@ -43,7 +43,7 @@ public: virtual ~ScCalcOptionsDialog(); DECL_LINK( SettingsSelHdl, Control* ); - DECL_LINK( BtnToggleHdl, RadioButton* ); + DECL_LINK( BtnToggleHdl, void* ); const ScCalcConfig& GetConfig() const; commit 3a8f10ddb4bfbbf76590102bbcaa10c9aa2c0af3 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 23 21:10:50 2012 -0400 Honor the configuration option in the interpreter. Change-Id: I686d1f3703cbb122e1b3ed010a727163be2e942a diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 566d0b3..c35cdfd 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -243,21 +243,26 @@ double ScInterpreter::ConvertStringToValue( const String& rStr ) SetError( mnStringNoValueError); return fValue; } - // The number scanner does not accept empty strings or strings containing - // only spaces, be on par in these cases with what was accepted in OOo and - // is in AOO (see also the #else branch below) and convert to 0 to prevent - // interoperability nightmares. - if (!rStr.Len()) - return fValue; - else if (rStr.GetChar(0) == ' ') + + if (GetGlobalConfig().mbEmptyStringAsZero) { - const sal_Unicode* p = rStr.GetBuffer() + 1; - const sal_Unicode* const pStop = p - 1 + rStr.Len(); - while (p < pStop && *p == ' ') - ++p; - if (p == pStop) + // The number scanner does not accept empty strings or strings + // containing only spaces, be on par in these cases with what was + // accepted in OOo and is in AOO (see also the else branch below) and + // convert to 0 to prevent interoperability nightmares. + if (!rStr.Len()) return fValue; + else if (rStr.GetChar(0) == ' ') + { + const sal_Unicode* p = rStr.GetBuffer() + 1; + const sal_Unicode* const pStop = p - 1 + rStr.Len(); + while (p < pStop && *p == ' ') + ++p; + if (p == pStop) + return fValue; + } } + sal_uInt32 nFIndex = 0; if (!pFormatter->IsNumberFormat(rStr, nFIndex, fValue)) { commit 22cf0759547aa1803f77dbd3ee91774600dadc6f Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 23 21:05:00 2012 -0400 Let's not forget to set the description for this option. Change-Id: I9441ef145b62b84c1b4b8dd6ce85d6c0744f3103 diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx index 4fdffb8..3b1f8da 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.cxx +++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx @@ -214,6 +214,7 @@ void ScCalcOptionsDialog::SelectionChanged() maBtnTrue.Check(false); maBtnFalse.Check(true); } + maFtAnnotation.SetText(maDescEmptyStringAsZero); } break; default: commit 3f4b517ce0a82c0015d6723dfb2f4c48cf981c90 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 23 21:02:46 2012 -0400 Handle saving to and loading from user configuration. Change-Id: I81730077322b8890726da4d033f034c1266afa76 diff --git a/sc/source/core/tool/formulaopt.cxx b/sc/source/core/tool/formulaopt.cxx index d3d4e89..b5989ad 100644 --- a/sc/source/core/tool/formulaopt.cxx +++ b/sc/source/core/tool/formulaopt.cxx @@ -207,13 +207,14 @@ SfxPoolItem* ScTpFormulaItem::Clone( SfxItemPool * ) const #define CFGPATH_FORMULA "Office.Calc/Formula" -#define SCFORMULAOPT_GRAMMAR 0 -#define SCFORMULAOPT_ENGLISH_FUNCNAME 1 -#define SCFORMULAOPT_SEP_ARG 2 -#define SCFORMULAOPT_SEP_ARRAY_ROW 3 -#define SCFORMULAOPT_SEP_ARRAY_COL 4 -#define SCFORMULAOPT_STRING_REF_SYNTAX 5 -#define SCFORMULAOPT_COUNT 6 +#define SCFORMULAOPT_GRAMMAR 0 +#define SCFORMULAOPT_ENGLISH_FUNCNAME 1 +#define SCFORMULAOPT_SEP_ARG 2 +#define SCFORMULAOPT_SEP_ARRAY_ROW 3 +#define SCFORMULAOPT_SEP_ARRAY_COL 4 +#define SCFORMULAOPT_STRING_REF_SYNTAX 5 +#define SCFORMULAOPT_EMPTY_STRING_AS_ZERO 6 +#define SCFORMULAOPT_COUNT 7 Sequence<OUString> ScFormulaCfg::GetPropertyNames() { @@ -225,6 +226,7 @@ Sequence<OUString> ScFormulaCfg::GetPropertyNames() "Syntax/SeparatorArrayRow", // SCFORMULAOPT_SEP_ARRAY_ROW "Syntax/SeparatorArrayCol", // SCFORMULAOPT_SEP_ARRAY_COL "Syntax/StringRefAddressSyntax", // SCFORMULAOPT_STRING_REF_SYNTAX + "Syntax/EmptyStringAsZero", // SCFORMULAOPT_EMPTY_STRING_AS_ZERO }; Sequence<OUString> aNames(SCFORMULAOPT_COUNT); OUString* pNames = aNames.getArray(); @@ -341,6 +343,15 @@ ScFormulaCfg::ScFormulaCfg() : GetCalcConfig().meStringRefAddressSyntax = eConv; } break; + case SCFORMULAOPT_EMPTY_STRING_AS_ZERO: + { + sal_Bool bVal = GetCalcConfig().mbEmptyStringAsZero; + pValues[nProp] >>= bVal; + GetCalcConfig().mbEmptyStringAsZero = bVal; + } + break; + default: + ; } } } @@ -397,6 +408,14 @@ void ScFormulaCfg::Commit() pValues[nProp] <<= nVal; } break; + case SCFORMULAOPT_EMPTY_STRING_AS_ZERO: + { + sal_Bool bVal = GetCalcConfig().mbEmptyStringAsZero; + pValues[nProp] <<= bVal; + } + break; + default: + ; } } PutProperties(aNames, aValues); commit 253fad3580761d3d53e6b352aa3b7aeaa3810eee Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 23 20:16:46 2012 -0400 Add a new configuration option. Change-Id: Ib9ba5a2b269a2e20f8ba3703e8efc496357911ef diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs index 0f5898e..d9aaabd 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs @@ -1377,6 +1377,14 @@ </enumeration> </constraints> </prop> + <prop oor:name="EmptyStringAsZero" oor:type="xs:boolean" oor:nillable="false"> + <!-- UIHints: Tools - Options Spreadsheet Formula --> + <info> + <author>kyoshida</author> + <desc>Whether to treat empty string formula result as equivalent of having a numeric zero value.</desc> + </info> + <value>false</value> + </prop> </group> </group> <group oor:name="Revision"> commit 2ee9a0adacb6b163591ff0cbc1a0843c478403fb Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 23 18:10:08 2012 -0400 Using ScCalcConfig throughout saves quite a bit of code. Change-Id: I697b03d603a99cdb58c31d78447bbed10230311e diff --git a/sc/inc/formulaopt.hxx b/sc/inc/formulaopt.hxx index 5ca55a3..7cc2dd8 100644 --- a/sc/inc/formulaopt.hxx +++ b/sc/inc/formulaopt.hxx @@ -35,13 +35,14 @@ #include "formula/grammar.hxx" #include "scdllapi.h" #include "global.hxx" +#include "calcconfig.hxx" class SC_DLLPUBLIC ScFormulaOptions { private: bool bUseEnglishFuncName; // use English function name even if the locale is not English. formula::FormulaGrammar::Grammar eFormulaGrammar; // formula grammar used to switch different formula syntax - formula::FormulaGrammar::AddressConvention eStringRefSyntax; + ScCalcConfig aCalcConfig; ::rtl::OUString aFormulaSepArg; ::rtl::OUString aFormulaSepArrayRow; @@ -57,8 +58,9 @@ public: void SetFormulaSyntax( ::formula::FormulaGrammar::Grammar eGram ) { eFormulaGrammar = eGram; } ::formula::FormulaGrammar::Grammar GetFormulaSyntax() const { return eFormulaGrammar; } - void SetStringRefAddressSyntax(formula::FormulaGrammar::AddressConvention eConv) { eStringRefSyntax = eConv; } - formula::FormulaGrammar::AddressConvention GetStringRefAddressSyntax() const { return eStringRefSyntax; } + ScCalcConfig& GetCalcConfig() { return aCalcConfig; } + const ScCalcConfig& GetCalcConfig() const { return aCalcConfig; } + void SetCalcConfig(const ScCalcConfig& rConfig) { aCalcConfig = rConfig; } void SetUseEnglishFuncName( bool bVal ) { bUseEnglishFuncName = bVal; } bool GetUseEnglishFuncName() const { return bUseEnglishFuncName; } diff --git a/sc/source/core/tool/formulaopt.cxx b/sc/source/core/tool/formulaopt.cxx index 7cb1687..d3d4e89 100644 --- a/sc/source/core/tool/formulaopt.cxx +++ b/sc/source/core/tool/formulaopt.cxx @@ -55,7 +55,7 @@ ScFormulaOptions::ScFormulaOptions() ScFormulaOptions::ScFormulaOptions( const ScFormulaOptions& rCpy ) : bUseEnglishFuncName ( rCpy.bUseEnglishFuncName ), eFormulaGrammar ( rCpy.eFormulaGrammar ), - eStringRefSyntax(rCpy.eStringRefSyntax), + aCalcConfig(rCpy.aCalcConfig), aFormulaSepArg ( rCpy.aFormulaSepArg ), aFormulaSepArrayRow ( rCpy.aFormulaSepArrayRow ), aFormulaSepArrayCol ( rCpy.aFormulaSepArrayCol ) @@ -72,7 +72,7 @@ void ScFormulaOptions::SetDefaults() eFormulaGrammar = ::formula::FormulaGrammar::GRAM_NATIVE; // unspecified means use the current formula syntax. - eStringRefSyntax = formula::FormulaGrammar::CONV_UNSPECIFIED; + aCalcConfig.reset(); ResetFormulaSeparators(); } @@ -144,7 +144,7 @@ ScFormulaOptions& ScFormulaOptions::operator=( const ScFormulaOptions& rCpy ) { bUseEnglishFuncName = rCpy.bUseEnglishFuncName; eFormulaGrammar = rCpy.eFormulaGrammar; - eStringRefSyntax = rCpy.eStringRefSyntax; + aCalcConfig = rCpy.aCalcConfig; aFormulaSepArg = rCpy.aFormulaSepArg; aFormulaSepArrayRow = rCpy.aFormulaSepArrayRow; aFormulaSepArrayCol = rCpy.aFormulaSepArrayCol; @@ -155,7 +155,7 @@ bool ScFormulaOptions::operator==( const ScFormulaOptions& rOpt ) const { return bUseEnglishFuncName == rOpt.bUseEnglishFuncName && eFormulaGrammar == rOpt.eFormulaGrammar - && eStringRefSyntax == rOpt.eStringRefSyntax + && aCalcConfig == rOpt.aCalcConfig && aFormulaSepArg == rOpt.aFormulaSepArg && aFormulaSepArrayRow == rOpt.aFormulaSepArrayRow && aFormulaSepArrayCol == rOpt.aFormulaSepArrayCol; @@ -311,7 +311,7 @@ ScFormulaCfg::ScFormulaCfg() : case SCFORMULAOPT_STRING_REF_SYNTAX: { // Get default value in case this option is not set. - ::formula::FormulaGrammar::AddressConvention eConv = GetStringRefAddressSyntax(); + ::formula::FormulaGrammar::AddressConvention eConv = GetCalcConfig().meStringRefAddressSyntax; do { @@ -338,7 +338,7 @@ ScFormulaCfg::ScFormulaCfg() : } } while (false); - SetStringRefAddressSyntax(eConv); + GetCalcConfig().meStringRefAddressSyntax = eConv; } break; } @@ -387,7 +387,7 @@ void ScFormulaCfg::Commit() case SCFORMULAOPT_STRING_REF_SYNTAX: { sal_Int32 nVal = -1; - switch (GetStringRefAddressSyntax()) + switch (GetCalcConfig().meStringRefAddressSyntax) { case ::formula::FormulaGrammar::CONV_OOO: nVal = 0; break; case ::formula::FormulaGrammar::CONV_XL_A1: nVal = 1; break; diff --git a/sc/source/ui/docshell/docsh6.cxx b/sc/source/ui/docshell/docsh6.cxx index cdf9756..94b9787 100644 --- a/sc/source/ui/docshell/docsh6.cxx +++ b/sc/source/ui/docshell/docsh6.cxx @@ -496,9 +496,7 @@ void ScDocShell::SetFormulaOptions(const ScFormulaOptions& rOpt ) rOpt.GetFormulaSepArg(), rOpt.GetFormulaSepArrayCol(), rOpt.GetFormulaSepArrayRow()); // Global interpreter settings. - ScCalcConfig aConfig; - aConfig.meStringRefAddressSyntax = rOpt.GetStringRefAddressSyntax(); - ScInterpreter::SetGlobalConfig(aConfig); + ScInterpreter::SetGlobalConfig(rOpt.GetCalcConfig()); } void ScDocShell::CheckConfigOptions() diff --git a/sc/source/ui/optdlg/tpformula.cxx b/sc/source/ui/optdlg/tpformula.cxx index 59c1d8c..9675fa0 100644 --- a/sc/source/ui/optdlg/tpformula.cxx +++ b/sc/source/ui/optdlg/tpformula.cxx @@ -291,7 +291,7 @@ sal_Bool ScTpFormulaOptions::FillItemSet(SfxItemSet& rCoreSet) aOpt.SetFormulaSepArg(aSep); aOpt.SetFormulaSepArrayCol(aSepArrayCol); aOpt.SetFormulaSepArrayRow(aSepArrayRow); - aOpt.SetStringRefAddressSyntax(maCurrentConfig.meStringRefAddressSyntax); + aOpt.SetCalcConfig(maCurrentConfig); rCoreSet.Put( ScTpFormulaItem( SID_SCFORMULAOPTIONS, aOpt ) ); bRet = true; @@ -353,8 +353,8 @@ void ScTpFormulaOptions::Reset(const SfxItemSet& rCoreSet) // detailed calc settings. ScFormulaOptions aDefaults; - maSavedConfig.meStringRefAddressSyntax = aOpt.GetStringRefAddressSyntax(); - bool bDefault = aDefaults.GetStringRefAddressSyntax() == maSavedConfig.meStringRefAddressSyntax; + maSavedConfig = aOpt.GetCalcConfig(); + bool bDefault = aDefaults.GetCalcConfig() == maSavedConfig; UpdateCustomCalcRadioButtons(bDefault); maCurrentConfig = maSavedConfig; commit 4e8552993aed7caaa247bb1baf6168ddcfba159a Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 23 17:49:03 2012 -0400 Add new formula config option in the UI for "treat empty string as zero." Change-Id: I116857ee8b377c80707efbc76fcfa06c3e46201d diff --git a/sc/inc/calcconfig.hxx b/sc/inc/calcconfig.hxx index 48d4746..2006ba2 100644 --- a/sc/inc/calcconfig.hxx +++ b/sc/inc/calcconfig.hxx @@ -38,6 +38,7 @@ struct SC_DLLPUBLIC ScCalcConfig { formula::FormulaGrammar::AddressConvention meStringRefAddressSyntax; + bool mbEmptyStringAsZero:1; ScCalcConfig(); diff --git a/sc/source/core/tool/calcconfig.cxx b/sc/source/core/tool/calcconfig.cxx index 660869a..eab1467 100644 --- a/sc/source/core/tool/calcconfig.cxx +++ b/sc/source/core/tool/calcconfig.cxx @@ -29,7 +29,8 @@ #include "calcconfig.hxx" ScCalcConfig::ScCalcConfig() : - meStringRefAddressSyntax(formula::FormulaGrammar::CONV_UNSPECIFIED) {} + meStringRefAddressSyntax(formula::FormulaGrammar::CONV_UNSPECIFIED), + mbEmptyStringAsZero(false) {} void ScCalcConfig::reset() { @@ -38,7 +39,8 @@ void ScCalcConfig::reset() bool ScCalcConfig::operator== (const ScCalcConfig& r) const { - return meStringRefAddressSyntax == r.meStringRefAddressSyntax; + return meStringRefAddressSyntax == r.meStringRefAddressSyntax && + mbEmptyStringAsZero == r.mbEmptyStringAsZero; } bool ScCalcConfig::operator!= (const ScCalcConfig& r) const diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx index 2b75082..4fdffb8 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.cxx +++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx @@ -87,16 +87,22 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(Window* pParent, const ScCalcConfig& rC maLbSettings(this, ScResId(LB_SETTINGS)), maFtOptionEditCaption(this, ScResId(FT_OPTION_EDIT_CAPTION)), maLbOptionEdit(this, ScResId(LB_OPTION_EDIT)), + maBtnTrue(this, ScResId(BTN_OPTION_TRUE)), + maBtnFalse(this, ScResId(BTN_OPTION_FALSE)), maFlAnnotation(this, ScResId(FL_ANNOTATION)), maFtAnnotation(this, ScResId(FT_ANNOTATION)), maBtnOK(this, ScResId(BTN_OK)), maBtnCancel(this, ScResId(BTN_CANCEL)), + maTrue(ScResId(STR_TRUE).toString()), + maFalse(ScResId(STR_FALSE).toString()), maCalcA1(ScResId(SCSTR_FORMULA_SYNTAX_CALC_A1).toString()), maExcelA1(ScResId(SCSTR_FORMULA_SYNTAX_XL_A1).toString()), maExcelR1C1(ScResId(SCSTR_FORMULA_SYNTAX_XL_R1C1).toString()), maCaptionStringRefSyntax(ScResId(STR_STRING_REF_SYNTAX_CAPTION).toString()), maDescStringRefSyntax(ScResId(STR_STRING_REF_SYNTAX_DESC).toString()), maUseFormulaSyntax(ScResId(STR_USE_FORMULA_SYNTAX).toString()), + maCaptionEmptyStringAsZero(ScResId(STR_EMPTY_STRING_AS_ZERO_CAPTION).toString()), + maDescEmptyStringAsZero(ScResId(STR_EMPTY_STRING_AS_ZERO_DESC).toString()), maConfig(rConfig) { maLbSettings.SetStyle(maLbSettings.GetStyle() | WB_CLIPCHILDREN | WB_FORCE_MAKEVISIBLE); @@ -106,6 +112,12 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(Window* pParent, const ScCalcConfig& rC maLbSettings.SetSelectHdl(aLink); maLbOptionEdit.SetSelectHdl(aLink); + aLink = LINK(this, ScCalcOptionsDialog, BtnToggleHdl); + maBtnTrue.SetToggleHdl(aLink); // Set handler only to the 'True' button. + + maBtnTrue.SetText(maTrue); + maBtnFalse.SetText(maFalse); + FillOptionsList(); FreeResource(); SelectionChanged(); @@ -136,58 +148,134 @@ void ScCalcOptionsDialog::FillOptionsList() pModel->Insert(pEntry); } + { + // Treat empty string as zero. + SvLBoxEntry* pEntry = new SvLBoxEntry; + pEntry->AddItem(new SvLBoxString(pEntry, 0, rtl::OUString())); + pEntry->AddItem(new SvLBoxContextBmp(pEntry, 0, Image(), Image(), 0)); + OptionString* pItem = new OptionString( + maCaptionEmptyStringAsZero, toString(maConfig.mbEmptyStringAsZero)); + pEntry->AddItem(pItem); + pModel->Insert(pEntry); + } + maLbSettings.SetUpdateMode(true); } void ScCalcOptionsDialog::SelectionChanged() { - if (true) + sal_uInt16 nSelectedPos = maLbSettings.GetSelectEntryPos(); + switch (nSelectedPos) { - // Formula syntax for INDIRECT function. - maLbOptionEdit.Clear(); - maLbOptionEdit.InsertEntry(maUseFormulaSyntax); - maLbOptionEdit.InsertEntry(maCalcA1); - maLbOptionEdit.InsertEntry(maExcelA1); - maLbOptionEdit.InsertEntry(maExcelR1C1); - switch (maConfig.meStringRefAddressSyntax) + case 0: { - case formula::FormulaGrammar::CONV_OOO: - maLbOptionEdit.SelectEntryPos(1); - break; - case formula::FormulaGrammar::CONV_XL_A1: - maLbOptionEdit.SelectEntryPos(2); - break; - case formula::FormulaGrammar::CONV_XL_R1C1: - maLbOptionEdit.SelectEntryPos(3); - break; - case formula::FormulaGrammar::CONV_UNSPECIFIED: - default: - maLbOptionEdit.SelectEntryPos(0); + // Formula syntax for INDIRECT function. + maBtnTrue.Hide(); + maBtnFalse.Hide(); + maLbOptionEdit.Show(); + + maLbOptionEdit.Clear(); + maLbOptionEdit.InsertEntry(maUseFormulaSyntax); + maLbOptionEdit.InsertEntry(maCalcA1); + maLbOptionEdit.InsertEntry(maExcelA1); + maLbOptionEdit.InsertEntry(maExcelR1C1); + switch (maConfig.meStringRefAddressSyntax) + { + case formula::FormulaGrammar::CONV_OOO: + maLbOptionEdit.SelectEntryPos(1); + break; + case formula::FormulaGrammar::CONV_XL_A1: + maLbOptionEdit.SelectEntryPos(2); + break; + case formula::FormulaGrammar::CONV_XL_R1C1: + maLbOptionEdit.SelectEntryPos(3); + break; + case formula::FormulaGrammar::CONV_UNSPECIFIED: + default: + maLbOptionEdit.SelectEntryPos(0); + } + maFtAnnotation.SetText(maDescStringRefSyntax); + } + break; + case 1: + { + // Treat empty string as zero. + maLbOptionEdit.Hide(); + maBtnTrue.Show(); + maBtnFalse.Show(); + + if (maConfig.mbEmptyStringAsZero) + { + maBtnTrue.Check(true); + maBtnFalse.Check(false); + } + else + { + maBtnTrue.Check(false); + maBtnFalse.Check(true); + } } - maFtAnnotation.SetText(maDescStringRefSyntax); + break; + default: + ; } } void ScCalcOptionsDialog::ListOptionValueChanged() { - if (true) + sal_uInt16 nSelected = maLbSettings.GetSelectEntryPos(); + switch (nSelected) { - // Formula syntax for INDIRECT function. - sal_uInt16 nPos = maLbOptionEdit.GetSelectEntryPos(); - maConfig.meStringRefAddressSyntax = toAddressConvention(nPos); + case 0: + { + // Formula syntax for INDIRECT function. + sal_uInt16 nPos = maLbOptionEdit.GetSelectEntryPos(); + maConfig.meStringRefAddressSyntax = toAddressConvention(nPos); - maLbSettings.SetUpdateMode(false); + maLbSettings.SetUpdateMode(false); - SvLBoxTreeList* pModel = maLbSettings.GetModel(); - SvLBoxEntry* pEntry = pModel->GetEntry(NULL, 0); - if (!pEntry) - return; + SvLBoxTreeList* pModel = maLbSettings.GetModel(); + SvLBoxEntry* pEntry = pModel->GetEntry(NULL, 0); + if (!pEntry) + return; - OptionString* pItem = new OptionString( - maCaptionStringRefSyntax, toString(maConfig.meStringRefAddressSyntax)); - pEntry->ReplaceItem(pItem, 2); + OptionString* pItem = new OptionString( + maCaptionStringRefSyntax, toString(maConfig.meStringRefAddressSyntax)); + pEntry->ReplaceItem(pItem, 2); - maLbSettings.SetUpdateMode(true); + maLbSettings.SetUpdateMode(true); + } + break; + default: + ; + } +} + +void ScCalcOptionsDialog::RadioValueChanged() +{ + sal_uInt16 nSelected = maLbSettings.GetSelectEntryPos(); + switch (nSelected) + { + case 1: + { + // Treat empty string as zero. + maConfig.mbEmptyStringAsZero = maBtnTrue.IsChecked(); + maLbSettings.SetUpdateMode(false); + + SvLBoxTreeList* pModel = maLbSettings.GetModel(); + SvLBoxEntry* pEntry = pModel->GetEntry(NULL, 1); + if (!pEntry) + return; + + OptionString* pItem = new OptionString( + maCaptionEmptyStringAsZero, toString(maConfig.mbEmptyStringAsZero)); + pEntry->ReplaceItem(pItem, 2); + + maLbSettings.SetUpdateMode(true); + } + break; + default: + ; } } @@ -208,6 +296,11 @@ rtl::OUString ScCalcOptionsDialog::toString(formula::FormulaGrammar::AddressConv return maUseFormulaSyntax; } +rtl::OUString ScCalcOptionsDialog::toString(bool bVal) const +{ + return bVal ? maTrue : maFalse; +} + IMPL_LINK(ScCalcOptionsDialog, SettingsSelHdl, Control*, pCtrl) { if (pCtrl == &maLbSettings) @@ -218,4 +311,11 @@ IMPL_LINK(ScCalcOptionsDialog, SettingsSelHdl, Control*, pCtrl) return 0; } +IMPL_LINK(ScCalcOptionsDialog, BtnToggleHdl, RadioButton*, pBtn) +{ + RadioValueChanged(); + return 0; +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/optdlg/calcoptionsdlg.hrc b/sc/source/ui/optdlg/calcoptionsdlg.hrc index 6d87868..401f32d 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.hrc +++ b/sc/source/ui/optdlg/calcoptionsdlg.hrc @@ -34,6 +34,8 @@ #define FT_OPTION_EDIT_CAPTION 4 #define LB_OPTION_EDIT 5 +#define BTN_OPTION_TRUE 6 +#define BTN_OPTION_FALSE 7 #define FL_ANNOTATION 20 #define FT_ANNOTATION 21 @@ -43,4 +45,11 @@ #define STR_USE_FORMULA_SYNTAX 24 +#define STR_TRUE 25 +#define STR_FALSE 26 + +#define STR_EMPTY_STRING_AS_ZERO_CAPTION 27 +#define STR_EMPTY_STRING_AS_ZERO_DESC 28 + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/optdlg/calcoptionsdlg.hxx b/sc/source/ui/optdlg/calcoptionsdlg.hxx index a1e3cfc..85a62db 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.hxx +++ b/sc/source/ui/optdlg/calcoptionsdlg.hxx @@ -43,6 +43,7 @@ public: virtual ~ScCalcOptionsDialog(); DECL_LINK( SettingsSelHdl, Control* ); + DECL_LINK( BtnToggleHdl, RadioButton* ); const ScCalcConfig& GetConfig() const; @@ -50,14 +51,18 @@ private: void FillOptionsList(); void SelectionChanged(); void ListOptionValueChanged(); + void RadioValueChanged(); rtl::OUString toString(formula::FormulaGrammar::AddressConvention eConv) const; + rtl::OUString toString(bool bVal) const; private: SvxCheckListBox maLbSettings; FixedText maFtOptionEditCaption; ListBox maLbOptionEdit; + RadioButton maBtnTrue; + RadioButton maBtnFalse; FixedLine maFlAnnotation; FixedText maFtAnnotation; @@ -65,6 +70,9 @@ private: OKButton maBtnOK; CancelButton maBtnCancel; + rtl::OUString maTrue; + rtl::OUString maFalse; + rtl::OUString maCalcA1; rtl::OUString maExcelA1; rtl::OUString maExcelR1C1; @@ -73,6 +81,9 @@ private: rtl::OUString maDescStringRefSyntax; rtl::OUString maUseFormulaSyntax; + rtl::OUString maCaptionEmptyStringAsZero; + rtl::OUString maDescEmptyStringAsZero; + ScCalcConfig maConfig; }; diff --git a/sc/source/ui/optdlg/calcoptionsdlg.src b/sc/source/ui/optdlg/calcoptionsdlg.src index 58fa750..235ec0e 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.src +++ b/sc/source/ui/optdlg/calcoptionsdlg.src @@ -60,6 +60,20 @@ ModalDialog RID_SCDLG_FORMULA_CALCOPTIONS DropDown = TRUE ; }; + RadioButton BTN_OPTION_TRUE + { + Pos = MAP_APPFONT ( 50, 83 ) ; + Size = MAP_APPFONT ( 50, 14 ) ; + TabStop = TRUE ; + }; + + RadioButton BTN_OPTION_FALSE + { + Pos = MAP_APPFONT ( 110, 83 ) ; + Size = MAP_APPFONT ( 50, 14 ) ; + TabStop = TRUE ; + }; + FixedLine FL_ANNOTATION { Pos = MAP_APPFONT ( 6 , 98 ) ; @@ -103,4 +117,24 @@ ModalDialog RID_SCDLG_FORMULA_CALCOPTIONS { Text [ en-US ] = "Use formula syntax"; }; + + String STR_EMPTY_STRING_AS_ZERO_CAPTION + { + Text [ en-US ] = "Treat empty string as zero"; + }; + + String STR_EMPTY_STRING_AS_ZERO_DESC + { + Text [ en-US ] = "Blah."; + }; + + String STR_TRUE + { + Text [ en-US ] = "True"; + }; + + String STR_FALSE + { + Text [ en-US ] = "False"; + }; }; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits