diff options
author | Albert Thuswaldner <albert.thuswaldner@gmail.com> | 2012-02-25 01:07:18 +0100 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@suse.com> | 2012-02-27 12:13:29 -0500 |
commit | b091acc26d145f2194662df64806f09fb78ef006 (patch) | |
tree | bfd498cff3ee2f790cfabb504aab5671ab03cfc4 | |
parent | 660e4481a4ab00b1077dbc5e26568b7f6f05b2ba (diff) |
Moving misplaced Formula options from ScDocOptions to ScAppOptions
-rw-r--r-- | sc/inc/appoptio.hxx | 27 | ||||
-rw-r--r-- | sc/inc/docoptio.hxx | 37 | ||||
-rw-r--r-- | sc/inc/sc.hrc | 7 | ||||
-rw-r--r-- | sc/source/core/data/documen3.cxx | 13 | ||||
-rw-r--r-- | sc/source/core/tool/appoptio.cxx | 221 | ||||
-rw-r--r-- | sc/source/core/tool/docoptio.cxx | 217 | ||||
-rw-r--r-- | sc/source/ui/app/scmod.cxx | 102 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh6.cxx | 15 | ||||
-rw-r--r-- | sc/source/ui/inc/tpformula.hxx | 10 | ||||
-rw-r--r-- | sc/source/ui/optdlg/tpformula.cxx | 88 |
10 files changed, 421 insertions, 316 deletions
diff --git a/sc/inc/appoptio.hxx b/sc/inc/appoptio.hxx index fac4061b50c9..65b36769ede8 100644 --- a/sc/inc/appoptio.hxx +++ b/sc/inc/appoptio.hxx @@ -91,6 +91,24 @@ public: ScOptionsUtil::KeyBindingType GetKeyBindingType() const { return meKeyBindingType; } void SetKeyBindingType( ScOptionsUtil::KeyBindingType e ) { meKeyBindingType = e; } + void SetFormulaSyntax( ::formula::FormulaGrammar::Grammar eGram ) { eFormulaGrammar = eGram; } + ::formula::FormulaGrammar::Grammar GetFormulaSyntax() const { return eFormulaGrammar; } + + void SetUseEnglishFuncName( bool bVal ) { bUseEnglishFuncName = bVal; } + bool GetUseEnglishFuncName() const { return bUseEnglishFuncName; } + + void SetFormulaSepArg(const ::rtl::OUString& rSep) { aFormulaSepArg = rSep; } + ::rtl::OUString GetFormulaSepArg() const { return aFormulaSepArg; } + + void SetFormulaSepArrayRow(const ::rtl::OUString& rSep) { aFormulaSepArrayRow = rSep; } + ::rtl::OUString GetFormulaSepArrayRow() const { return aFormulaSepArrayRow; } + + void SetFormulaSepArrayCol(const ::rtl::OUString& rSep) { aFormulaSepArrayCol = rSep; } + ::rtl::OUString GetFormulaSepArrayCol() const { return aFormulaSepArrayCol; } + + void ResetFormulaSeparators(); + + static const LocaleDataWrapper& GetLocaleDataWrapper(); const ScAppOptions& operator= ( const ScAppOptions& rOpt ); @@ -114,6 +132,12 @@ private: sal_Int32 nDefaultObjectSizeHeight; sal_Bool mbShowSharedDocumentWarning; ScOptionsUtil::KeyBindingType meKeyBindingType; + 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 + + ::rtl::OUString aFormulaSepArg; + ::rtl::OUString aFormulaSepArrayRow; + ::rtl::OUString aFormulaSepArrayCol; }; @@ -133,6 +157,7 @@ class ScAppCfg : public ScAppOptions ScLinkConfigItem aSortListItem; ScLinkConfigItem aMiscItem; ScLinkConfigItem aCompatItem; + ScLinkConfigItem aFormulaItem; DECL_LINK( LayoutCommitHdl, void* ); DECL_LINK( InputCommitHdl, void* ); @@ -141,6 +166,7 @@ class ScAppCfg : public ScAppOptions DECL_LINK( SortListCommitHdl, void* ); DECL_LINK( MiscCommitHdl, void* ); DECL_LINK( CompatCommitHdl, void* ); + DECL_LINK( FormulaCommitHdl, void* ); com::sun::star::uno::Sequence<rtl::OUString> GetLayoutPropertyNames(); com::sun::star::uno::Sequence<rtl::OUString> GetInputPropertyNames(); @@ -149,6 +175,7 @@ class ScAppCfg : public ScAppOptions com::sun::star::uno::Sequence<rtl::OUString> GetSortListPropertyNames(); com::sun::star::uno::Sequence<rtl::OUString> GetMiscPropertyNames(); com::sun::star::uno::Sequence<rtl::OUString> GetCompatPropertyNames(); + com::sun::star::uno::Sequence<rtl::OUString> GetFormulaPropertyNames(); public: ScAppCfg(); diff --git a/sc/inc/docoptio.hxx b/sc/inc/docoptio.hxx index de44cf043208..78fd5e941514 100644 --- a/sc/inc/docoptio.hxx +++ b/sc/inc/docoptio.hxx @@ -57,13 +57,6 @@ class SC_DLLPUBLIC ScDocOptions sal_Bool bDoAutoSpell; // auto-spelling sal_Bool bLookUpColRowNames; // determine column-/row titles automagically sal_Bool bFormulaRegexEnabled; // regular expressions in formulas enabled - 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 - - ::rtl::OUString aFormulaSepArg; - ::rtl::OUString aFormulaSepArrayRow; - ::rtl::OUString aFormulaSepArrayCol; - public: ScDocOptions(); ScDocOptions( const ScDocOptions& rCpy ); @@ -113,23 +106,6 @@ public: void SetFormulaRegexEnabled( sal_Bool bVal ) { bFormulaRegexEnabled = bVal; } sal_Bool IsFormulaRegexEnabled() const { return bFormulaRegexEnabled; } - void SetFormulaSyntax( ::formula::FormulaGrammar::Grammar eGram ) { eFormulaGrammar = eGram; } - ::formula::FormulaGrammar::Grammar GetFormulaSyntax() const { return eFormulaGrammar; } - - void SetUseEnglishFuncName( bool bVal ) { bUseEnglishFuncName = bVal; } - bool GetUseEnglishFuncName() const { return bUseEnglishFuncName; } - - void SetFormulaSepArg(const ::rtl::OUString& rSep) { aFormulaSepArg = rSep; } - ::rtl::OUString GetFormulaSepArg() const { return aFormulaSepArg; } - - void SetFormulaSepArrayRow(const ::rtl::OUString& rSep) { aFormulaSepArrayRow = rSep; } - ::rtl::OUString GetFormulaSepArrayRow() const { return aFormulaSepArrayRow; } - - void SetFormulaSepArrayCol(const ::rtl::OUString& rSep) { aFormulaSepArrayCol = rSep; } - ::rtl::OUString GetFormulaSepArrayCol() const { return aFormulaSepArrayCol; } - - void ResetFormulaSeparators(); - static const LocaleDataWrapper& GetLocaleDataWrapper(); }; inline const ScDocOptions& ScDocOptions::operator=( const ScDocOptions& rCpy ) @@ -151,11 +127,6 @@ inline const ScDocOptions& ScDocOptions::operator=( const ScDocOptions& rCpy ) bDoAutoSpell = rCpy.bDoAutoSpell; bLookUpColRowNames = rCpy.bLookUpColRowNames; bFormulaRegexEnabled= rCpy.bFormulaRegexEnabled; - bUseEnglishFuncName = rCpy.bUseEnglishFuncName; - eFormulaGrammar = rCpy.eFormulaGrammar; - aFormulaSepArg = rCpy.aFormulaSepArg; - aFormulaSepArrayRow = rCpy.aFormulaSepArrayRow; - aFormulaSepArrayCol = rCpy.aFormulaSepArrayCol; return *this; } @@ -180,11 +151,6 @@ inline bool ScDocOptions::operator==( const ScDocOptions& rOpt ) const && rOpt.bDoAutoSpell == bDoAutoSpell && rOpt.bLookUpColRowNames == bLookUpColRowNames && rOpt.bFormulaRegexEnabled == bFormulaRegexEnabled - && rOpt.bUseEnglishFuncName == bUseEnglishFuncName - && rOpt.eFormulaGrammar == eFormulaGrammar - && rOpt.aFormulaSepArg == aFormulaSepArg - && rOpt.aFormulaSepArrayRow == aFormulaSepArrayRow - && rOpt.aFormulaSepArrayCol == aFormulaSepArrayCol ); } @@ -223,17 +189,14 @@ private: class ScDocCfg : public ScDocOptions { ScLinkConfigItem aCalcItem; - ScLinkConfigItem aFormulaItem; ScLinkConfigItem aLayoutItem; ScLinkConfigItem aDefaultsItem; DECL_LINK( CalcCommitHdl, void* ); - DECL_LINK( FormulaCommitHdl, void* ); DECL_LINK( LayoutCommitHdl, void* ); DECL_LINK( DefaultsCommitHdl, void* ); com::sun::star::uno::Sequence<rtl::OUString> GetCalcPropertyNames(); - com::sun::star::uno::Sequence<rtl::OUString> GetFormulaPropertyNames(); com::sun::star::uno::Sequence<rtl::OUString> GetLayoutPropertyNames(); com::sun::star::uno::Sequence<rtl::OUString> GetDefaultsPropertyNames(); diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc index 27cb28b8849e..ad4649e4623e 100644 --- a/sc/inc/sc.hrc +++ b/sc/inc/sc.hrc @@ -116,6 +116,13 @@ #define FID_MARKPAGEUP (SC_VIEW_START + 18) #define FID_MARKPAGEDOWN (SC_VIEW_START + 19) +// Format options +#define SID_SC_OPT_FORMULA_ENGLISH_FUNCNAME (SC_VIEW_START + 20) +#define SID_SC_OPT_FORMULA_GRAMMAR (SC_VIEW_START + 21) +#define SID_SC_OPT_FORMULA_SEP_ARG (SC_VIEW_START + 22) +#define SID_SC_OPT_FORMULA_SEP_ARRAY_ROW (SC_VIEW_START + 23) +#define SID_SC_OPT_FORMULA_SEP_ARRAY_COL (SC_VIEW_START + 24) + // slot-IDs for attributes #define SID_SCATTR_HOR_JUSTIFY (SC_VIEW_START + 30) // alignment-page diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx index e9a665343dae..28eab09ade60 100644 --- a/sc/source/core/data/documen3.cxx +++ b/sc/source/core/data/documen3.cxx @@ -55,6 +55,7 @@ #include "compiler.hxx" #include "refupdat.hxx" #include "docoptio.hxx" +#include "appoptio.hxx" #include "viewopti.hxx" #include "scextopt.hxx" #include "brdcst.hxx" @@ -1937,20 +1938,22 @@ const ScDocOptions& ScDocument::GetDocOptions() const void ScDocument::SetDocOptions( const ScDocOptions& rOpt ) { + ScAppOptions rAppOpt=SC_MOD()->GetAppOptions(); + OSL_ENSURE( pDocOptions, "No DocOptions! :-(" ); - bool bUpdateFuncNames = pDocOptions->GetUseEnglishFuncName() != rOpt.GetUseEnglishFuncName(); + // bool bUpdateFuncNames = pDocOptions->GetUseEnglishFuncName() != rOpt.GetUseEnglishFuncName(); *pDocOptions = rOpt; xPoolHelper->SetFormTableOpt(rOpt); - SetGrammar( rOpt.GetFormulaSyntax() ); + SetGrammar( rAppOpt.GetFormulaSyntax() ); - if (bUpdateFuncNames) + //if (bUpdateFuncNames) { // This needs to be called first since it may re-initialize the entire // opcode map. - if (rOpt.GetUseEnglishFuncName()) + if (rAppOpt.GetUseEnglishFuncName()) { // switch native symbols to English. ScCompiler aComp(NULL, ScAddress()); @@ -1967,7 +1970,7 @@ void ScDocument::SetDocOptions( const ScDocOptions& rOpt ) // Update the separators. ScCompiler::UpdateSeparatorsNative( - rOpt.GetFormulaSepArg(), rOpt.GetFormulaSepArrayCol(), rOpt.GetFormulaSepArrayRow()); + rAppOpt.GetFormulaSepArg(), rAppOpt.GetFormulaSepArrayCol(), rAppOpt.GetFormulaSepArrayRow()); } const ScViewOptions& ScDocument::GetViewOptions() const diff --git a/sc/source/core/tool/appoptio.cxx b/sc/source/core/tool/appoptio.cxx index d53328bd1aa4..3df026e2ffdf 100644 --- a/sc/source/core/tool/appoptio.cxx +++ b/sc/source/core/tool/appoptio.cxx @@ -35,6 +35,8 @@ #include <com/sun/star/uno/Any.hxx> #include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/lang/Locale.hpp> +#include <com/sun/star/i18n/LocaleDataItem.hpp> #include "cfgids.hxx" #include "appoptio.hxx" @@ -48,7 +50,8 @@ using namespace utl; using namespace com::sun::star::uno; - +using ::com::sun::star::lang::Locale; +using ::com::sun::star::i18n::LocaleDataItem; using ::rtl::OUString; // STATIC DATA ----------------------------------------------------------- @@ -118,8 +121,71 @@ void ScAppOptions::SetDefaults() mbShowSharedDocumentWarning = true; meKeyBindingType = ScOptionsUtil::KEY_DEFAULT; + + bUseEnglishFuncName = false; + eFormulaGrammar = ::formula::FormulaGrammar::GRAM_NATIVE; + + ResetFormulaSeparators(); +} + +void ScAppOptions::ResetFormulaSeparators() +{ + // Defaults to the old separator values. + aFormulaSepArg = OUString(RTL_CONSTASCII_USTRINGPARAM(";")); + aFormulaSepArrayCol = OUString(RTL_CONSTASCII_USTRINGPARAM(";")); + aFormulaSepArrayRow = OUString(RTL_CONSTASCII_USTRINGPARAM("|")); + + const Locale& rLocale = *ScGlobal::GetLocale(); + const OUString& rLang = rLocale.Language; + if (rLang.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ru"))) + // Don't do automatic guess for these languages, and fall back to + // the old separator set. + return; + + const LocaleDataWrapper& rLocaleData = GetLocaleDataWrapper(); + const OUString& rDecSep = rLocaleData.getNumDecimalSep(); + const OUString& rListSep = rLocaleData.getListSep(); + + if (rDecSep.isEmpty() || rListSep.isEmpty()) + // Something is wrong. Stick with the default separators. + return; + + sal_Unicode cDecSep = rDecSep.getStr()[0]; + sal_Unicode cListSep = rListSep.getStr()[0]; + + // Excel by default uses system's list separator as the parameter + // separator, which in English locales is a comma. However, OOo's list + // separator value is set to ';' for all English locales. Because of this + // discrepancy, we will hardcode the separator value here, for now. + if (cDecSep == sal_Unicode('.')) + cListSep = sal_Unicode(','); + + // Special case for de_CH locale. + if (rLocale.Language.equalsAsciiL("de", 2) && rLocale.Country.equalsAsciiL("CH", 2)) + cListSep = sal_Unicode(';'); + + // by default, the parameter separator equals the locale-specific + // list separator. + aFormulaSepArg = OUString(cListSep); + + if (cDecSep == cListSep && cDecSep != sal_Unicode(';')) + // if the decimal and list separators are equal, set the + // parameter separator to be ';', unless they are both + // semicolon in which case don't change the decimal separator. + aFormulaSepArg = OUString(RTL_CONSTASCII_USTRINGPARAM(";")); + + aFormulaSepArrayCol = OUString(RTL_CONSTASCII_USTRINGPARAM(",")); + if (cDecSep == sal_Unicode(',')) + aFormulaSepArrayCol = OUString(RTL_CONSTASCII_USTRINGPARAM(".")); + aFormulaSepArrayRow = OUString(RTL_CONSTASCII_USTRINGPARAM(";")); +} + +const LocaleDataWrapper& ScAppOptions::GetLocaleDataWrapper() +{ + return *ScGlobal::pLocaleData; } + const ScAppOptions& ScAppOptions::operator=( const ScAppOptions& rCpy ) { nTabCountInNewSpreadsheet = rCpy.nTabCountInNewSpreadsheet; @@ -140,6 +206,12 @@ const ScAppOptions& ScAppOptions::operator=( const ScAppOptions& rCpy ) nDefaultObjectSizeHeight = rCpy.nDefaultObjectSizeHeight; mbShowSharedDocumentWarning = rCpy.mbShowSharedDocumentWarning; meKeyBindingType = rCpy.meKeyBindingType; + bUseEnglishFuncName = rCpy.bUseEnglishFuncName; + eFormulaGrammar = rCpy.eFormulaGrammar; + aFormulaSepArg = rCpy.aFormulaSepArg; + aFormulaSepArrayRow = rCpy.aFormulaSepArrayRow; + aFormulaSepArrayCol = rCpy.aFormulaSepArrayCol; + return *this; } @@ -295,6 +367,13 @@ void lcl_GetSortList( Any& rDest ) #define SCCOMPATOPT_KEY_BINDING 0 #define SCCOMPATOPT_COUNT 1 +#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_COUNT 5 Sequence<OUString> ScAppCfg::GetLayoutPropertyNames() { @@ -409,6 +488,24 @@ Sequence<OUString> ScAppCfg::GetCompatPropertyNames() return aNames; } +Sequence<OUString> ScAppCfg::GetFormulaPropertyNames() +{ + static const char* aPropNames[] = + { + "Syntax/Grammar", // SCFORMULAOPT_GRAMMAR + "Syntax/EnglishFunctionName", // SCFORMULAOPT_ENGLISH_FUNCNAME + "Syntax/SeparatorArg", // SCFORMULAOPT_SEP_ARG + "Syntax/SeparatorArrayRow", // SCFORMULAOPT_SEP_ARRAY_ROW + "Syntax/SeparatorArrayCol", // SCFORMULAOPT_SEP_ARRAY_COL + }; + Sequence<OUString> aNames(SCFORMULAOPT_COUNT); + OUString* pNames = aNames.getArray(); + for (int i = 0; i < SCFORMULAOPT_COUNT; ++i) + pNames[i] = OUString::createFromAscii(aPropNames[i]); + + return aNames; +} + ScAppCfg::ScAppCfg() : aLayoutItem( OUString(RTL_CONSTASCII_USTRINGPARAM( CFGPATH_LAYOUT )) ), aInputItem( OUString(RTL_CONSTASCII_USTRINGPARAM( CFGPATH_INPUT )) ), @@ -416,7 +513,9 @@ ScAppCfg::ScAppCfg() : aContentItem( OUString(RTL_CONSTASCII_USTRINGPARAM( CFGPATH_CONTENT )) ), aSortListItem( OUString(RTL_CONSTASCII_USTRINGPARAM( CFGPATH_SORTLIST )) ), aMiscItem( OUString(RTL_CONSTASCII_USTRINGPARAM( CFGPATH_MISC )) ), - aCompatItem( OUString(RTL_CONSTASCII_USTRINGPARAM(CFGPATH_COMPAT )) ) + aCompatItem( OUString(RTL_CONSTASCII_USTRINGPARAM(CFGPATH_COMPAT )) ), + aFormulaItem( OUString(RTL_CONSTASCII_USTRINGPARAM(CFGPATH_FORMULA )) ) + { sal_Int32 nIntVal = 0; @@ -616,6 +715,79 @@ ScAppCfg::ScAppCfg() : } } aCompatItem.SetCommitLink( LINK(this, ScAppCfg, CompatCommitHdl) ); + + aNames = GetFormulaPropertyNames(); + aValues = aFormulaItem.GetProperties(aNames); + aFormulaItem.EnableNotification(aNames); + pValues = aValues.getConstArray(); + if (aValues.getLength() == aNames.getLength()) + { + for (int nProp = 0; nProp < aNames.getLength(); ++nProp) + { + switch (nProp) + { + case SCFORMULAOPT_GRAMMAR: + { + // Get default value in case this option is not set. + ::formula::FormulaGrammar::Grammar eGram = GetFormulaSyntax(); + + do + { + if (!(pValues[nProp] >>= nIntVal)) + // extractino failed. + break; + + switch (nIntVal) + { + case 0: // Calc A1 + eGram = ::formula::FormulaGrammar::GRAM_NATIVE; + break; + case 1: // Excel A1 + eGram = ::formula::FormulaGrammar::GRAM_NATIVE_XL_A1; + break; + case 2: // Excel R1C1 + eGram = ::formula::FormulaGrammar::GRAM_NATIVE_XL_R1C1; + break; + default: + ; + } + } + while (false); + SetFormulaSyntax(eGram); + } + break; + case SCFORMULAOPT_ENGLISH_FUNCNAME: + { + sal_Bool bEnglish = false; + if (pValues[nProp] >>= bEnglish) + SetUseEnglishFuncName(bEnglish); + } + break; + case SCFORMULAOPT_SEP_ARG: + { + OUString aSep; + if ((pValues[nProp] >>= aSep) && !aSep.isEmpty()) + SetFormulaSepArg(aSep); + } + break; + case SCFORMULAOPT_SEP_ARRAY_ROW: + { + OUString aSep; + if ((pValues[nProp] >>= aSep) && !aSep.isEmpty()) + SetFormulaSepArrayRow(aSep); + } + break; + case SCFORMULAOPT_SEP_ARRAY_COL: + { + OUString aSep; + if ((pValues[nProp] >>= aSep) && !aSep.isEmpty()) + SetFormulaSepArrayCol(aSep); + } + break; + } + } + } + aFormulaItem.SetCommitLink( LINK(this, ScAppCfg, FormulaCommitHdl) ); } IMPL_LINK( ScAppCfg, LayoutCommitHdl, void *, EMPTYARG ) @@ -790,6 +962,50 @@ IMPL_LINK( ScAppCfg, CompatCommitHdl, void *, EMPTYARG ) return 0; } +IMPL_LINK( ScAppCfg, FormulaCommitHdl, void *, EMPTYARG ) +{ + Sequence<OUString> aNames = GetFormulaPropertyNames(); + Sequence<Any> aValues(aNames.getLength()); + Any* pValues = aValues.getArray(); + + for (int nProp = 0; nProp < aNames.getLength(); ++nProp) + { + switch (nProp) + { + case SCFORMULAOPT_GRAMMAR : + { + sal_Int32 nVal = 0; + switch (GetFormulaSyntax()) + { + case ::formula::FormulaGrammar::GRAM_NATIVE_XL_A1: nVal = 1; break; + case ::formula::FormulaGrammar::GRAM_NATIVE_XL_R1C1: nVal = 2; break; + default: break; + } + pValues[nProp] <<= nVal; + } + break; + case SCFORMULAOPT_ENGLISH_FUNCNAME: + { + sal_Bool b = GetUseEnglishFuncName(); + pValues[nProp] <<= b; + } + break; + case SCFORMULAOPT_SEP_ARG: + pValues[nProp] <<= GetFormulaSepArg(); + break; + case SCFORMULAOPT_SEP_ARRAY_ROW: + pValues[nProp] <<= GetFormulaSepArrayRow(); + break; + case SCFORMULAOPT_SEP_ARRAY_COL: + pValues[nProp] <<= GetFormulaSepArrayCol(); + break; + } + } + aFormulaItem.PutProperties(aNames, aValues); + + return 0; +} + void ScAppCfg::SetOptions( const ScAppOptions& rNew ) { *(ScAppOptions*)this = rNew; @@ -805,6 +1021,7 @@ void ScAppCfg::OptionsChanged() aSortListItem.SetModified(); aMiscItem.SetModified(); aCompatItem.SetModified(); + aFormulaItem.SetModified(); } diff --git a/sc/source/core/tool/docoptio.cxx b/sc/source/core/tool/docoptio.cxx index b8fd5873a098..db5f952abbd0 100644 --- a/sc/source/core/tool/docoptio.cxx +++ b/sc/source/core/tool/docoptio.cxx @@ -34,8 +34,6 @@ #include <com/sun/star/uno/Any.hxx> #include <com/sun/star/uno/Sequence.hxx> -#include <com/sun/star/lang/Locale.hpp> -#include <com/sun/star/i18n/LocaleDataItem.hpp> #include "cfgids.hxx" #include "docoptio.hxx" @@ -48,8 +46,6 @@ using namespace utl; using namespace com::sun::star::uno; -using ::com::sun::star::lang::Locale; -using ::com::sun::star::i18n::LocaleDataItem; using ::rtl::OUString; //------------------------------------------------------------------------ @@ -102,12 +98,7 @@ ScDocOptions::ScDocOptions( const ScDocOptions& rCpy ) bMatchWholeCell( rCpy.bMatchWholeCell ), bDoAutoSpell( rCpy.bDoAutoSpell ), bLookUpColRowNames( rCpy.bLookUpColRowNames ), - bFormulaRegexEnabled( rCpy.bFormulaRegexEnabled ), - bUseEnglishFuncName( rCpy.bUseEnglishFuncName ), - eFormulaGrammar( rCpy.eFormulaGrammar ), - aFormulaSepArg( rCpy.aFormulaSepArg ), - aFormulaSepArrayRow( rCpy.aFormulaSepArrayRow ), - aFormulaSepArrayCol( rCpy.aFormulaSepArrayCol ) + bFormulaRegexEnabled( rCpy.bFormulaRegexEnabled ) { } @@ -138,67 +129,6 @@ void ScDocOptions::ResetDocOptions() bDoAutoSpell = false; bLookUpColRowNames = true; bFormulaRegexEnabled= true; - bUseEnglishFuncName = false; - eFormulaGrammar = ::formula::FormulaGrammar::GRAM_NATIVE; - - ResetFormulaSeparators(); -} - -void ScDocOptions::ResetFormulaSeparators() -{ - // Defaults to the old separator values. - aFormulaSepArg = OUString(RTL_CONSTASCII_USTRINGPARAM(";")); - aFormulaSepArrayCol = OUString(RTL_CONSTASCII_USTRINGPARAM(";")); - aFormulaSepArrayRow = OUString(RTL_CONSTASCII_USTRINGPARAM("|")); - - const Locale& rLocale = *ScGlobal::GetLocale(); - const OUString& rLang = rLocale.Language; - if (rLang.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ru"))) - // Don't do automatic guess for these languages, and fall back to - // the old separator set. - return; - - const LocaleDataWrapper& rLocaleData = GetLocaleDataWrapper(); - const OUString& rDecSep = rLocaleData.getNumDecimalSep(); - const OUString& rListSep = rLocaleData.getListSep(); - - if (rDecSep.isEmpty() || rListSep.isEmpty()) - // Something is wrong. Stick with the default separators. - return; - - sal_Unicode cDecSep = rDecSep.getStr()[0]; - sal_Unicode cListSep = rListSep.getStr()[0]; - - // Excel by default uses system's list separator as the parameter - // separator, which in English locales is a comma. However, OOo's list - // separator value is set to ';' for all English locales. Because of this - // discrepancy, we will hardcode the separator value here, for now. - if (cDecSep == sal_Unicode('.')) - cListSep = sal_Unicode(','); - - // Special case for de_CH locale. - if (rLocale.Language.equalsAsciiL("de", 2) && rLocale.Country.equalsAsciiL("CH", 2)) - cListSep = sal_Unicode(';'); - - // by default, the parameter separator equals the locale-specific - // list separator. - aFormulaSepArg = OUString(cListSep); - - if (cDecSep == cListSep && cDecSep != sal_Unicode(';')) - // if the decimal and list separators are equal, set the - // parameter separator to be ';', unless they are both - // semicolon in which case don't change the decimal separator. - aFormulaSepArg = OUString(RTL_CONSTASCII_USTRINGPARAM(";")); - - aFormulaSepArrayCol = OUString(RTL_CONSTASCII_USTRINGPARAM(",")); - if (cDecSep == sal_Unicode(',')) - aFormulaSepArrayCol = OUString(RTL_CONSTASCII_USTRINGPARAM(".")); - aFormulaSepArrayRow = OUString(RTL_CONSTASCII_USTRINGPARAM(";")); -} - -const LocaleDataWrapper& ScDocOptions::GetLocaleDataWrapper() -{ - return *ScGlobal::pLocaleData; } //======================================================================== @@ -272,14 +202,6 @@ SfxPoolItem* ScTpCalcItem::Clone( SfxItemPool * ) const #define SCCALCOPT_REGEX 11 #define SCCALCOPT_COUNT 12 -#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_COUNT 5 - #define CFGPATH_DOCLAYOUT "Office.Calc/Layout/Other" #define SCDOCLAYOUTOPT_TABSTOP 0 @@ -316,24 +238,6 @@ Sequence<OUString> ScDocCfg::GetCalcPropertyNames() return aNames; } -Sequence<OUString> ScDocCfg::GetFormulaPropertyNames() -{ - static const char* aPropNames[] = - { - "Syntax/Grammar", // SCFORMULAOPT_GRAMMAR - "Syntax/EnglishFunctionName", // SCFORMULAOPT_ENGLISH_FUNCNAME - "Syntax/SeparatorArg", // SCFORMULAOPT_SEP_ARG - "Syntax/SeparatorArrayRow", // SCFORMULAOPT_SEP_ARRAY_ROW - "Syntax/SeparatorArrayCol", // SCFORMULAOPT_SEP_ARRAY_COL - }; - Sequence<OUString> aNames(SCFORMULAOPT_COUNT); - OUString* pNames = aNames.getArray(); - for (int i = 0; i < SCFORMULAOPT_COUNT; ++i) - pNames[i] = OUString::createFromAscii(aPropNames[i]); - - return aNames; -} - Sequence<OUString> ScDocCfg::GetLayoutPropertyNames() { static const char* aPropNames[] = @@ -370,7 +274,6 @@ Sequence<OUString> ScDocCfg::GetDefaultsPropertyNames() ScDocCfg::ScDocCfg() : aCalcItem( OUString(RTL_CONSTASCII_USTRINGPARAM( CFGPATH_CALC )) ), - aFormulaItem(OUString(RTL_CONSTASCII_USTRINGPARAM(CFGPATH_FORMULA))), aLayoutItem(OUString(RTL_CONSTASCII_USTRINGPARAM(CFGPATH_DOCLAYOUT))), aDefaultsItem(OUString(RTL_CONSTASCII_USTRINGPARAM(CFGPATH_DEFAULTS))) { @@ -443,79 +346,6 @@ ScDocCfg::ScDocCfg() : SetDate( nDateDay, nDateMonth, nDateYear ); - aNames = GetFormulaPropertyNames(); - aValues = aFormulaItem.GetProperties(aNames); - aFormulaItem.EnableNotification(aNames); - pValues = aValues.getConstArray(); - if (aValues.getLength() == aNames.getLength()) - { - for (int nProp = 0; nProp < aNames.getLength(); ++nProp) - { - switch (nProp) - { - case SCFORMULAOPT_GRAMMAR: - { - // Get default value in case this option is not set. - ::formula::FormulaGrammar::Grammar eGram = GetFormulaSyntax(); - - do - { - if (!(pValues[nProp] >>= nIntVal)) - // extractino failed. - break; - - switch (nIntVal) - { - case 0: // Calc A1 - eGram = ::formula::FormulaGrammar::GRAM_NATIVE; - break; - case 1: // Excel A1 - eGram = ::formula::FormulaGrammar::GRAM_NATIVE_XL_A1; - break; - case 2: // Excel R1C1 - eGram = ::formula::FormulaGrammar::GRAM_NATIVE_XL_R1C1; - break; - default: - ; - } - } - while (false); - SetFormulaSyntax(eGram); - } - break; - case SCFORMULAOPT_ENGLISH_FUNCNAME: - { - sal_Bool bEnglish = false; - if (pValues[nProp] >>= bEnglish) - SetUseEnglishFuncName(bEnglish); - } - break; - case SCFORMULAOPT_SEP_ARG: - { - OUString aSep; - if ((pValues[nProp] >>= aSep) && !aSep.isEmpty()) - SetFormulaSepArg(aSep); - } - break; - case SCFORMULAOPT_SEP_ARRAY_ROW: - { - OUString aSep; - if ((pValues[nProp] >>= aSep) && !aSep.isEmpty()) - SetFormulaSepArrayRow(aSep); - } - break; - case SCFORMULAOPT_SEP_ARRAY_COL: - { - OUString aSep; - if ((pValues[nProp] >>= aSep) && !aSep.isEmpty()) - SetFormulaSepArrayCol(aSep); - } - break; - } - } - } - aFormulaItem.SetCommitLink( LINK(this, ScDocCfg, FormulaCommitHdl) ); - aNames = GetLayoutPropertyNames(); aValues = aLayoutItem.GetProperties(aNames); aLayoutItem.EnableNotification(aNames); @@ -624,50 +454,6 @@ IMPL_LINK( ScDocCfg, CalcCommitHdl, void *, EMPTYARG ) return 0; } -IMPL_LINK( ScDocCfg, FormulaCommitHdl, void *, EMPTYARG ) -{ - Sequence<OUString> aNames = GetFormulaPropertyNames(); - Sequence<Any> aValues(aNames.getLength()); - Any* pValues = aValues.getArray(); - - for (int nProp = 0; nProp < aNames.getLength(); ++nProp) - { - switch (nProp) - { - case SCFORMULAOPT_GRAMMAR : - { - sal_Int32 nVal = 0; - switch (GetFormulaSyntax()) - { - case ::formula::FormulaGrammar::GRAM_NATIVE_XL_A1: nVal = 1; break; - case ::formula::FormulaGrammar::GRAM_NATIVE_XL_R1C1: nVal = 2; break; - default: break; - } - pValues[nProp] <<= nVal; - } - break; - case SCFORMULAOPT_ENGLISH_FUNCNAME: - { - sal_Bool b = GetUseEnglishFuncName(); - pValues[nProp] <<= b; - } - break; - case SCFORMULAOPT_SEP_ARG: - pValues[nProp] <<= GetFormulaSepArg(); - break; - case SCFORMULAOPT_SEP_ARRAY_ROW: - pValues[nProp] <<= GetFormulaSepArrayRow(); - break; - case SCFORMULAOPT_SEP_ARRAY_COL: - pValues[nProp] <<= GetFormulaSepArrayCol(); - break; - } - } - aFormulaItem.PutProperties(aNames, aValues); - - return 0; -} - IMPL_LINK( ScDocCfg, LayoutCommitHdl, void *, EMPTYARG ) { Sequence<OUString> aNames = GetLayoutPropertyNames(); @@ -718,7 +504,6 @@ void ScDocCfg::SetOptions( const ScDocOptions& rNew ) *(ScDocOptions*)this = rNew; aCalcItem.SetModified(); - aFormulaItem.SetModified(); aLayoutItem.SetModified(); aDefaultsItem.SetModified(); } diff --git a/sc/source/ui/app/scmod.cxx b/sc/source/ui/app/scmod.cxx index d34847f49c83..9798306af7c3 100644 --- a/sc/source/ui/app/scmod.cxx +++ b/sc/source/ui/app/scmod.cxx @@ -987,6 +987,7 @@ void ScModule::ModifyOptions( const SfxItemSet& rOptSet ) sal_Bool bCalcAll = false; sal_Bool bSaveAppOptions = false; sal_Bool bSaveInputOptions = false; + sal_Bool bUpdateDocFormat = false; //-------------------------------------------------------------------------- @@ -1027,6 +1028,77 @@ void ScModule::ModifyOptions( const SfxItemSet& rOptSet ) } //============================================ + // FormulaOptions + //============================================ + + + if (rOptSet.HasItem(SID_SC_OPT_FORMULA_ENGLISH_FUNCNAME, &pItem)) + { + pAppCfg->SetUseEnglishFuncName( static_cast<const SfxBoolItem*>(pItem)->GetValue() ); + bSaveAppOptions = true; + bUpdateDocFormat = true; + } + + if (rOptSet.HasItem(SID_SC_OPT_FORMULA_GRAMMAR, &pItem)) + { + sal_uInt16 nVal = static_cast<const SfxUInt16Item*>(pItem)->GetValue(); + ::formula::FormulaGrammar::Grammar eOld = pAppCfg->GetFormulaSyntax(); + ::formula::FormulaGrammar::Grammar eNew; + + switch (nVal) + { + case 0: + eNew = ::formula::FormulaGrammar::GRAM_NATIVE; + break; + case 1: + eNew = ::formula::FormulaGrammar::GRAM_NATIVE_XL_A1; + break; + case 2: + eNew = ::formula::FormulaGrammar::GRAM_NATIVE_XL_R1C1; + break; + } + + if (eOld != eNew) + { + pAppCfg->SetFormulaSyntax(eNew); + bSaveAppOptions = true; + bUpdateDocFormat = true; + } + } + + if (rOptSet.HasItem(SID_SC_OPT_FORMULA_SEP_ARG, &pItem)) + { + pAppCfg->SetFormulaSepArg( static_cast<const SfxStringItem*>(pItem)->GetValue() ); + bSaveAppOptions = true; + bUpdateDocFormat = true; + } + + if (rOptSet.HasItem(SID_SC_OPT_FORMULA_SEP_ARRAY_ROW, &pItem)) + { + pAppCfg->SetFormulaSepArrayRow( static_cast<const SfxStringItem*>(pItem)->GetValue() ); + bSaveAppOptions = true; + bUpdateDocFormat = true; + } + + if (rOptSet.HasItem(SID_SC_OPT_FORMULA_SEP_ARRAY_COL, &pItem)) + { + pAppCfg->SetFormulaSepArrayCol( static_cast<const SfxStringItem*>(pItem)->GetValue() ); + bSaveAppOptions = true; + bUpdateDocFormat = true; + } + + // Do all the format updates on open documents in one go + if ( bUpdateDocFormat && pDoc ) + { + const ScDocOptions& rOpt = pDoc->GetDocOptions(); // Temporary fix to keep + // SettDocOption call as is + + // Needs update. + pDoc->SetDocOptions( rOpt ); + pDocSh->SetDocumentModified(); + } + + //============================================ // ViewOptions //============================================ @@ -1924,8 +1996,16 @@ SfxItemSet* ScModule::CreateItemSet( sal_uInt16 nId ) SID_ATTR_DEFTABSTOP, SID_ATTR_DEFTABSTOP, // TP_COMPATIBILITY SID_SC_OPT_KEY_BINDING_COMPAT, SID_SC_OPT_KEY_BINDING_COMPAT, + // TP_FORMULA + SID_SC_OPT_FORMULA_ENGLISH_FUNCNAME, SID_SC_OPT_FORMULA_ENGLISH_FUNCNAME, + SID_SC_OPT_FORMULA_GRAMMAR, SID_SC_OPT_FORMULA_GRAMMAR, + SID_SC_OPT_FORMULA_SEP_ARG, SID_SC_OPT_FORMULA_SEP_ARG, + SID_SC_OPT_FORMULA_SEP_ARRAY_COL, SID_SC_OPT_FORMULA_SEP_ARRAY_COL, + SID_SC_OPT_FORMULA_SEP_ARRAY_ROW, SID_SC_OPT_FORMULA_SEP_ARRAY_ROW, 0 ); + const ScAppOptions& rAppOpt = GetAppOptions(); + ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current()); ScDocOptions aCalcOpt = pDocSh @@ -1944,7 +2024,7 @@ SfxItemSet* ScModule::CreateItemSet( sal_uInt16 nId ) // SFX_APP()->GetOptions( aSet ); pRet->Put( SfxUInt16Item( SID_ATTR_METRIC, - sal::static_int_cast<sal_uInt16>(GetAppOptions().GetAppMetric()) ) ); + sal::static_int_cast<sal_uInt16>(rAppOpt.GetAppMetric()) ) ); // TP_CALC pRet->Put( SfxUInt16Item( SID_ATTR_DEFTABSTOP, @@ -1953,7 +2033,7 @@ SfxItemSet* ScModule::CreateItemSet( sal_uInt16 nId ) // TP_VIEW pRet->Put( ScTpViewItem( SID_SCVIEWOPTIONS, aViewOpt ) ); - pRet->Put( SfxBoolItem( SID_SC_OPT_SYNCZOOM, GetAppOptions().GetSynchronizeZoom() ) ); + pRet->Put( SfxBoolItem( SID_SC_OPT_SYNCZOOM, rAppOpt.GetSynchronizeZoom() ) ); // TP_INPUT const ScInputOptions& rInpOpt = GetInputOptions(); @@ -1989,10 +2069,22 @@ SfxItemSet* ScModule::CreateItemSet( sal_uInt16 nId ) aULItem.SetUserList( *pUL ); // TP_COMPATIBILITY - pRet->Put( - SfxUInt16Item( - SID_SC_OPT_KEY_BINDING_COMPAT, GetAppOptions().GetKeyBindingType())); + pRet->Put( SfxUInt16Item( SID_SC_OPT_KEY_BINDING_COMPAT, + rAppOpt.GetKeyBindingType() ) ); + + // TP_FORMULA + pRet->Put( SfxBoolItem( SID_SC_OPT_FORMULA_ENGLISH_FUNCNAME, + rAppOpt.GetUseEnglishFuncName() ) ); + pRet->Put( SfxUInt16Item( SID_SC_OPT_FORMULA_GRAMMAR, + rAppOpt.GetFormulaSyntax() ) ); + pRet->Put( SfxStringItem( SID_SC_OPT_FORMULA_SEP_ARG, + rAppOpt.GetFormulaSepArg() ) ); + pRet->Put( SfxStringItem( SID_SC_OPT_FORMULA_SEP_ARRAY_COL, + rAppOpt.GetFormulaSepArrayCol() ) ); + pRet->Put( SfxStringItem( SID_SC_OPT_FORMULA_SEP_ARRAY_ROW, + rAppOpt.GetFormulaSepArrayRow() ) ); +// pRet->Put( aULItem ); } diff --git a/sc/source/ui/docshell/docsh6.cxx b/sc/source/ui/docshell/docsh6.cxx index afbbf21b934e..c02956cc4236 100644 --- a/sc/source/ui/docshell/docsh6.cxx +++ b/sc/source/ui/docshell/docsh6.cxx @@ -47,7 +47,7 @@ #include "viewdata.hxx" #include "tabvwsh.hxx" #include "tablink.hxx" -#include "docoptio.hxx" +#include "appoptio.hxx" #include "globstr.hrc" #include "scmod.hxx" @@ -495,19 +495,18 @@ void ScDocShell::CheckConfigOptions() OUString aDecSep = ScGlobal::GetpLocaleData()->getNumDecimalSep(); ScModule* pScMod = SC_MOD(); - const ScDocOptions& rOpt = pScMod->GetDocOptions(); - OUString aSepArg = rOpt.GetFormulaSepArg(); - OUString aSepArrRow = rOpt.GetFormulaSepArrayRow(); - OUString aSepArrCol = rOpt.GetFormulaSepArrayCol(); + const ScAppOptions& rAppOpt=pScMod->GetAppOptions(); + OUString aSepArg = rAppOpt.GetFormulaSepArg(); + OUString aSepArrRow = rAppOpt.GetFormulaSepArrayRow(); + OUString aSepArrCol = rAppOpt.GetFormulaSepArrayCol(); if (aDecSep == aSepArg || aDecSep == aSepArrRow || aDecSep == aSepArrCol) { // One of arg separators conflicts with the current decimal // separator. Reset them to default. - ScDocOptions aNew = rOpt; + ScAppOptions aNew = rAppOpt; aNew.ResetFormulaSeparators(); - aDocument.SetDocOptions(aNew); - pScMod->SetDocOptions(aNew); + pScMod->SetAppOptions(aNew); // Launch a nice warning dialog to let the users know of this change. ScTabViewShell* pViewShell = GetBestViewShell(); diff --git a/sc/source/ui/inc/tpformula.hxx b/sc/source/ui/inc/tpformula.hxx index b3d61a32a97e..83abbb981b2e 100644 --- a/sc/source/ui/inc/tpformula.hxx +++ b/sc/source/ui/inc/tpformula.hxx @@ -37,7 +37,9 @@ #include <memory> -class ScDocOptions; +#include <boost/shared_ptr.hpp> + +class ScAppOptions; class SfxItemSet; class Window; @@ -57,7 +59,6 @@ private: explicit ScTpFormulaOptions(Window* pParent, const SfxItemSet& rCoreSet); virtual ~ScTpFormulaOptions(); - void Init(); void ResetSeparators(); void OnFocusSeparatorInput(Edit* pEdit); @@ -83,10 +84,7 @@ private: Edit maEdSepArrayRow; PushButton maBtnSepReset; - SAL_WNODEPRECATED_DECLARATIONS_PUSH - ::std::auto_ptr<ScDocOptions> mpOldOptions; - ::std::auto_ptr<ScDocOptions> mpNewOptions; - SAL_WNODEPRECATED_DECLARATIONS_POP + ::boost::shared_ptr<ScAppOptions> mpOptions; /** Stores old separator value of currently focused separator edit box. This value is used to revert undesired value change. */ diff --git a/sc/source/ui/optdlg/tpformula.cxx b/sc/source/ui/optdlg/tpformula.cxx index 5d625935b4a7..241cac04e18c 100644 --- a/sc/source/ui/optdlg/tpformula.cxx +++ b/sc/source/ui/optdlg/tpformula.cxx @@ -33,11 +33,15 @@ //------------------------------------------------------------------ +#include <scmod.hxx> +#include <svl/eitem.hxx> +#include <svl/stritem.hxx> + #include "tpformula.hxx" #include "optdlg.hrc" #include "scresid.hxx" #include "formula/grammar.hxx" -#include "docoptio.hxx" +#include "appoptio.hxx" #include "global.hxx" #include <unotools/localedatawrapper.hxx> @@ -65,26 +69,12 @@ ScTpFormulaOptions::ScTpFormulaOptions(Window* pParent, const SfxItemSet& rCoreA maEdSepArrayRow(this, ScResId(ED_FORMULA_SEP_ARRAY_R)), maBtnSepReset(this, ScResId(BTN_FORMULA_SEP_RESET)), - mpOldOptions(NULL), - mpNewOptions(NULL), mnDecSep(0) { FreeResource(); - const ScTpCalcItem& rItem = static_cast<const ScTpCalcItem&>( - rCoreAttrs.Get(GetWhich(SID_SCDOCOPTIONS))); - mpOldOptions.reset(new ScDocOptions(rItem.GetDocOptions())); - mpNewOptions.reset(new ScDocOptions(rItem.GetDocOptions())); - - Init(); -} - -ScTpFormulaOptions::~ScTpFormulaOptions() -{ -} + mpOptions.reset( new ScAppOptions( SC_MOD()->GetAppOptions() ) ); -void ScTpFormulaOptions::Init() -{ Link aLink = LINK( this, ScTpFormulaOptions, ButtonHdl ); maBtnSepReset.SetClickHdl(aLink); @@ -99,16 +89,20 @@ void ScTpFormulaOptions::Init() maEdSepArrayRow.SetGetFocusHdl(aLink); // Get the decimal separator for current locale. - String aSep = mpOldOptions->GetLocaleDataWrapper().getNumDecimalSep(); + String aSep = mpOptions->GetLocaleDataWrapper().getNumDecimalSep(); mnDecSep = aSep.Len() ? aSep.GetChar(0) : sal_Unicode('.'); } +ScTpFormulaOptions::~ScTpFormulaOptions() +{ +} + void ScTpFormulaOptions::ResetSeparators() { - ScDocOptions aOpt; - maEdSepFuncArg.SetText(aOpt.GetFormulaSepArg()); - maEdSepArrayCol.SetText(aOpt.GetFormulaSepArrayCol()); - maEdSepArrayRow.SetText(aOpt.GetFormulaSepArrayRow()); + ScAppOptions rAppOpt=SC_MOD()->GetAppOptions(); + maEdSepFuncArg.SetText(rAppOpt.GetFormulaSepArg()); + maEdSepArrayCol.SetText(rAppOpt.GetFormulaSepArrayCol()); + maEdSepArrayRow.SetText(rAppOpt.GetFormulaSepArrayRow()); } void ScTpFormulaOptions::OnFocusSeparatorInput(Edit* pEdit) @@ -215,7 +209,13 @@ SfxTabPage* ScTpFormulaOptions::Create(Window* pParent, const SfxItemSet& rCoreS sal_Bool ScTpFormulaOptions::FillItemSet(SfxItemSet& rCoreSet) { + sal_Bool bRet = false; + sal_Bool bEnglishFuncName = maCbEnglishFuncName.IsChecked(); ::formula::FormulaGrammar::Grammar eGram = ::formula::FormulaGrammar::GRAM_DEFAULT; + OUString aSep = maEdSepFuncArg.GetText(); + OUString aSepArrayCol = maEdSepArrayCol.GetText(); + OUString aSepArrayRow = maEdSepArrayRow.GetText(); + switch (maLbFormulaSyntax.GetSelectEntryPos()) { case 0: @@ -229,24 +229,38 @@ sal_Bool ScTpFormulaOptions::FillItemSet(SfxItemSet& rCoreSet) break; } - mpNewOptions->SetFormulaSyntax(eGram); - mpNewOptions->SetUseEnglishFuncName(maCbEnglishFuncName.IsChecked()); - mpNewOptions->SetFormulaSepArg(maEdSepFuncArg.GetText()); - mpNewOptions->SetFormulaSepArrayCol(maEdSepArrayCol.GetText()); - mpNewOptions->SetFormulaSepArrayRow(maEdSepArrayRow.GetText()); - - if (*mpNewOptions != *mpOldOptions) + if ( bEnglishFuncName != mpOptions->GetUseEnglishFuncName() ) { - rCoreSet.Put(ScTpCalcItem(GetWhich(SID_SCDOCOPTIONS), *mpNewOptions)); - return true; + rCoreSet.Put( SfxBoolItem( SID_SC_OPT_FORMULA_ENGLISH_FUNCNAME, bEnglishFuncName ) ); + bRet = true; } - else - return false; + if ( eGram != mpOptions->GetFormulaSyntax() ) + { + rCoreSet.Put( SfxUInt16Item( SID_SC_OPT_FORMULA_GRAMMAR, eGram ) ); + bRet = true; + } + if ( aSep != mpOptions->GetFormulaSepArg() ) + { + rCoreSet.Put( SfxStringItem( SID_SC_OPT_FORMULA_SEP_ARG, aSep ) ); + bRet = true; + } + if ( aSepArrayCol != mpOptions->GetFormulaSepArrayCol() ) + { + rCoreSet.Put( SfxStringItem( SID_SC_OPT_FORMULA_SEP_ARRAY_ROW, aSepArrayCol ) ); + bRet = true; + } + if ( aSepArrayRow != mpOptions->GetFormulaSepArrayRow() ) + { + rCoreSet.Put( SfxStringItem( SID_SC_OPT_FORMULA_SEP_ARRAY_COL, aSepArrayRow ) ); + bRet = true; + } + + return bRet; } void ScTpFormulaOptions::Reset(const SfxItemSet& /*rCoreSet*/) { - ::formula::FormulaGrammar::Grammar eGram = mpNewOptions->GetFormulaSyntax(); + ::formula::FormulaGrammar::Grammar eGram = mpOptions->GetFormulaSyntax(); switch (eGram) { case ::formula::FormulaGrammar::GRAM_NATIVE: @@ -262,11 +276,11 @@ void ScTpFormulaOptions::Reset(const SfxItemSet& /*rCoreSet*/) maLbFormulaSyntax.SelectEntryPos(0); } - maCbEnglishFuncName.Check(mpNewOptions->GetUseEnglishFuncName()); + maCbEnglishFuncName.Check(mpOptions->GetUseEnglishFuncName()); - OUString aSep = mpNewOptions->GetFormulaSepArg(); - OUString aSepArrayRow = mpNewOptions->GetFormulaSepArrayRow(); - OUString aSepArrayCol = mpNewOptions->GetFormulaSepArrayCol(); + OUString aSep = mpOptions->GetFormulaSepArg(); + OUString aSepArrayRow = mpOptions->GetFormulaSepArrayRow(); + OUString aSepArrayCol = mpOptions->GetFormulaSepArrayCol(); if (aSep.getLength() == 1 && aSepArrayRow.getLength() == 1 && aSepArrayCol.getLength() == 1) { |