[Libreoffice-commits] core.git: Branch 'feature/unitver' - officecfg/registry sc/inc sc/source sc/uiconfig

Benjamin Ni benjaminniri at hotmail.com
Sun Jul 5 10:54:12 PDT 2015


 officecfg/registry/schema/org/openoffice/Office/Calc.xcs |    7 +
 sc/inc/formulaopt.hxx                                    |    4 
 sc/source/core/tool/formulaopt.cxx                       |   58 +++++++++-----
 sc/source/ui/inc/tpformula.hxx                           |    1 
 sc/source/ui/optdlg/tpformula.cxx                        |    9 ++
 sc/source/ui/view/viewfunc.cxx                           |   61 ++++++++-------
 sc/uiconfig/scalc/ui/optformula.ui                       |   17 ++++
 7 files changed, 111 insertions(+), 46 deletions(-)

New commits:
commit fc2a471d90521e1a9500b27088bbd122002049b0
Author: Benjamin Ni <benjaminniri at hotmail.com>
Date:   Fri Jul 3 04:40:29 2015 +0100

    Added checkbox and config option to toggle unit verification
    
    Change-Id: Ie218821d05466b77ed42a26365b04a6798dec067

diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
index bb74d74..d25ef1c 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
@@ -1424,6 +1424,13 @@
           </info>
           <value>false</value>
         </prop>
+        <prop oor:name="UnitValidat" oor:type="xs:boolean" oor:nillable="false">
+          <!-- UIHints: Tools - Options  Spreadsheet  Formula -->
+          <info>
+            <desc>Whether to check for unit consistency upon entering formulae.</desc>
+          </info>
+          <value>false</value>
+        </prop>
         <prop oor:name="SeparatorArg" oor:type="xs:string" oor:nillable="false">
           <!-- UIHints: Tools - Options  Spreadsheet  Formula -->
           <info>
diff --git a/sc/inc/formulaopt.hxx b/sc/inc/formulaopt.hxx
index 5b71b2a..b3ad9f6 100644
--- a/sc/inc/formulaopt.hxx
+++ b/sc/inc/formulaopt.hxx
@@ -23,6 +23,7 @@ class SC_DLLPUBLIC ScFormulaOptions
 {
 private:
     bool bUseEnglishFuncName;     // use English function name even if the locale is not English.
+    bool bUnitValidat;
     formula::FormulaGrammar::Grammar eFormulaGrammar;  // formula grammar used to switch different formula syntax
     ScCalcConfig aCalcConfig;
 
@@ -50,6 +51,9 @@ public:
     void SetUseEnglishFuncName( bool bVal ) { bUseEnglishFuncName = bVal; }
     bool GetUseEnglishFuncName() const { return bUseEnglishFuncName; }
 
+    void SetUnitValidat( bool bVal ) { bUnitValidat = bVal; }
+    bool GetUnitValidat() const { return bUnitValidat; }
+
     void SetFormulaSepArg(const OUString& rSep) { aFormulaSepArg = rSep; }
     OUString GetFormulaSepArg() const { return aFormulaSepArg; }
 
diff --git a/sc/source/core/tool/formulaopt.cxx b/sc/source/core/tool/formulaopt.cxx
index 1e0a5f5..8e7e54f 100644
--- a/sc/source/core/tool/formulaopt.cxx
+++ b/sc/source/core/tool/formulaopt.cxx
@@ -34,8 +34,9 @@ ScFormulaOptions::ScFormulaOptions()
 
 ScFormulaOptions::ScFormulaOptions( const ScFormulaOptions& rCpy ) :
     bUseEnglishFuncName ( rCpy.bUseEnglishFuncName ),
+    bUnitValidat        ( rCpy.bUnitValidat ),
     eFormulaGrammar     ( rCpy.eFormulaGrammar ),
-    aCalcConfig(rCpy.aCalcConfig),
+    aCalcConfig         ( rCpy.aCalcConfig ),
     aFormulaSepArg      ( rCpy.aFormulaSepArg ),
     aFormulaSepArrayRow ( rCpy.aFormulaSepArrayRow ),
     aFormulaSepArrayCol ( rCpy.aFormulaSepArrayCol ),
@@ -51,6 +52,7 @@ ScFormulaOptions::~ScFormulaOptions()
 void ScFormulaOptions::SetDefaults()
 {
     bUseEnglishFuncName = false;
+    bUnitValidat = false;
     eFormulaGrammar     = ::formula::FormulaGrammar::GRAM_NATIVE;
     meOOXMLRecalc = RECALC_ASK;
     meODFRecalc = RECALC_ASK;
@@ -127,8 +129,9 @@ const LocaleDataWrapper& ScFormulaOptions::GetLocaleDataWrapper()
 ScFormulaOptions& ScFormulaOptions::operator=( const ScFormulaOptions& rCpy )
 {
     bUseEnglishFuncName = rCpy.bUseEnglishFuncName;
+    bUnitValidat        = rCpy.bUnitValidat;
     eFormulaGrammar     = rCpy.eFormulaGrammar;
-    aCalcConfig = rCpy.aCalcConfig;
+    aCalcConfig         = rCpy.aCalcConfig;
     aFormulaSepArg      = rCpy.aFormulaSepArg;
     aFormulaSepArrayRow = rCpy.aFormulaSepArrayRow;
     aFormulaSepArrayCol = rCpy.aFormulaSepArrayCol;
@@ -140,8 +143,9 @@ ScFormulaOptions& ScFormulaOptions::operator=( const ScFormulaOptions& rCpy )
 bool ScFormulaOptions::operator==( const ScFormulaOptions& rOpt ) const
 {
     return bUseEnglishFuncName == rOpt.bUseEnglishFuncName
+        && bUnitValidat        == rOpt.bUnitValidat
         && eFormulaGrammar     == rOpt.eFormulaGrammar
-        && aCalcConfig == rOpt.aCalcConfig
+        && aCalcConfig         == rOpt.aCalcConfig
         && aFormulaSepArg      == rOpt.aFormulaSepArg
         && aFormulaSepArrayRow == rOpt.aFormulaSepArrayRow
         && aFormulaSepArrayCol == rOpt.aFormulaSepArrayCol
@@ -185,22 +189,23 @@ 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_STRING_CONVERSION    6
-#define SCFORMULAOPT_EMPTY_OUSTRING_AS_ZERO 7
-#define SCFORMULAOPT_OOXML_RECALC         8
-#define SCFORMULAOPT_ODF_RECALC           9
-#define SCFORMULAOPT_OPENCL_AUTOSELECT   10
-#define SCFORMULAOPT_OPENCL_DEVICE       11
-#define SCFORMULAOPT_OPENCL_SUBSET_ONLY  12
-#define SCFORMULAOPT_OPENCL_MIN_SIZE     13
-#define SCFORMULAOPT_OPENCL_SUBSET_OPS   14
-#define SCFORMULAOPT_COUNT               15
+#define SCFORMULAOPT_GRAMMAR                0
+#define SCFORMULAOPT_ENGLISH_FUNCNAME       1
+#define SCFORMULAOPT_UNIT_VALIDAT           2
+#define SCFORMULAOPT_SEP_ARG                3
+#define SCFORMULAOPT_SEP_ARRAY_ROW          4
+#define SCFORMULAOPT_SEP_ARRAY_COL          5
+#define SCFORMULAOPT_STRING_REF_SYNTAX      6
+#define SCFORMULAOPT_STRING_CONVERSION      7
+#define SCFORMULAOPT_EMPTY_OUSTRING_AS_ZERO 8
+#define SCFORMULAOPT_OOXML_RECALC           9
+#define SCFORMULAOPT_ODF_RECALC            10
+#define SCFORMULAOPT_OPENCL_AUTOSELECT     11
+#define SCFORMULAOPT_OPENCL_DEVICE         12
+#define SCFORMULAOPT_OPENCL_SUBSET_ONLY    13
+#define SCFORMULAOPT_OPENCL_MIN_SIZE       14
+#define SCFORMULAOPT_OPENCL_SUBSET_OPS     15
+#define SCFORMULAOPT_COUNT                 16
 
 Sequence<OUString> ScFormulaCfg::GetPropertyNames()
 {
@@ -208,6 +213,7 @@ Sequence<OUString> ScFormulaCfg::GetPropertyNames()
     {
         "Syntax/Grammar",                // SCFORMULAOPT_GRAMMAR
         "Syntax/EnglishFunctionName",    // SCFORMULAOPT_ENGLISH_FUNCNAME
+        "Syntax/UnitValidat",            // SCFORMULAOPT_UNIT_VALIDAT
         "Syntax/SeparatorArg",           // SCFORMULAOPT_SEP_ARG
         "Syntax/SeparatorArrayRow",      // SCFORMULAOPT_SEP_ARRAY_ROW
         "Syntax/SeparatorArrayCol",      // SCFORMULAOPT_SEP_ARRAY_COL
@@ -236,6 +242,7 @@ ScFormulaCfg::PropsToIds ScFormulaCfg::GetPropNamesToId()
     static sal_uInt16 aVals[] = {
         SCFORMULAOPT_GRAMMAR,
         SCFORMULAOPT_ENGLISH_FUNCNAME,
+        SCFORMULAOPT_UNIT_VALIDAT,
         SCFORMULAOPT_SEP_ARG,
         SCFORMULAOPT_SEP_ARRAY_ROW,
         SCFORMULAOPT_SEP_ARRAY_COL,
@@ -319,6 +326,13 @@ void ScFormulaCfg::UpdateFromProperties( const Sequence<OUString>& aNames )
                         SetUseEnglishFuncName(bEnglish);
                 }
                 break;
+                case SCFORMULAOPT_UNIT_VALIDAT:
+                {
+                    bool bValidat = false;
+                    if (pValues[nProp] >>= bValidat)
+                        SetUnitValidat(bValidat);
+                }
+                break;
                 case SCFORMULAOPT_SEP_ARG:
                 {
                     OUString aSep;
@@ -531,6 +545,12 @@ void ScFormulaCfg::ImplCommit()
                 pValues[nProp] <<= b;
             }
             break;
+            case SCFORMULAOPT_UNIT_VALIDAT:
+            {
+                bool b = GetUnitValidat();
+                pValues[nProp] <<= b;
+            }
+            break;
             case SCFORMULAOPT_SEP_ARG:
                 pValues[nProp] <<= GetFormulaSepArg();
             break;
diff --git a/sc/source/ui/inc/tpformula.hxx b/sc/source/ui/inc/tpformula.hxx
index 7397d06..e94f20d 100644
--- a/sc/source/ui/inc/tpformula.hxx
+++ b/sc/source/ui/inc/tpformula.hxx
@@ -58,6 +58,7 @@ private:
 private:
     VclPtr<ListBox>     mpLbFormulaSyntax;
     VclPtr<CheckBox>    mpCbEnglishFuncName;
+    VclPtr<CheckBox>    mpCbUnitValidat;
 
     VclPtr<RadioButton> mpBtnCustomCalcDefault;
     VclPtr<RadioButton> mpBtnCustomCalcCustom;
diff --git a/sc/source/ui/optdlg/tpformula.cxx b/sc/source/ui/optdlg/tpformula.cxx
index 3e7feb1..949a155 100644
--- a/sc/source/ui/optdlg/tpformula.cxx
+++ b/sc/source/ui/optdlg/tpformula.cxx
@@ -44,6 +44,7 @@ ScTpFormulaOptions::ScTpFormulaOptions(vcl::Window* pParent, const SfxItemSet& r
 {
     get(mpLbFormulaSyntax, "formulasyntax");
     get(mpCbEnglishFuncName, "englishfuncname");
+    get(mpCbUnitValidat, "unitvalidat");
     get(mpBtnCustomCalcDefault, "calcdefault");
     get(mpBtnCustomCalcCustom, "calccustom");
     get(mpBtnCustomCalcDetails, "details");
@@ -88,6 +89,7 @@ void ScTpFormulaOptions::dispose()
 {
     mpLbFormulaSyntax.clear();
     mpCbEnglishFuncName.clear();
+    mpCbUnitValidat.clear();
     mpBtnCustomCalcDefault.clear();
     mpBtnCustomCalcCustom.clear();
     mpBtnCustomCalcDetails.clear();
@@ -247,6 +249,7 @@ bool ScTpFormulaOptions::FillItemSet(SfxItemSet* rCoreSet)
     bool bRet = false;
     ScFormulaOptions aOpt;
     bool bEnglishFuncName = mpCbEnglishFuncName->IsChecked();
+    bool bUnitValidat     = mpCbUnitValidat->IsChecked();
     sal_Int16 aSyntaxPos      = mpLbFormulaSyntax->GetSelectEntryPos();
     OUString aSep             = mpEdSepFuncArg->GetText();
     OUString aSepArrayCol     = mpEdSepArrayCol->GetText();
@@ -262,6 +265,7 @@ bool ScTpFormulaOptions::FillItemSet(SfxItemSet* rCoreSet)
 
     if ( mpLbFormulaSyntax->GetSavedValue() != aSyntaxPos
          || mpCbEnglishFuncName->GetSavedValue() != (bEnglishFuncName ? 1 : 0)
+         || mpCbUnitValidat->GetSavedValue() != (bUnitValidat ? 1 : 0)
          || static_cast<OUString>(mpEdSepFuncArg->GetSavedValue()) != aSep
          || static_cast<OUString>(mpEdSepArrayCol->GetSavedValue()) != aSepArrayCol
          || static_cast<OUString>(mpEdSepArrayRow->GetSavedValue()) != aSepArrayRow
@@ -289,6 +293,7 @@ bool ScTpFormulaOptions::FillItemSet(SfxItemSet* rCoreSet)
 
         aOpt.SetFormulaSyntax(eGram);
         aOpt.SetUseEnglishFuncName(bEnglishFuncName);
+        aOpt.SetUnitValidat(bUnitValidat);
         aOpt.SetFormulaSepArg(aSep);
         aOpt.SetFormulaSepArrayCol(aSepArrayCol);
         aOpt.SetFormulaSepArrayRow(aSepArrayRow);
@@ -342,6 +347,10 @@ void ScTpFormulaOptions::Reset(const SfxItemSet* rCoreSet)
     mpCbEnglishFuncName->Check( aOpt.GetUseEnglishFuncName() );
     mpCbEnglishFuncName->SaveValue();
 
+    // unit validation
+    mpCbUnitValidat->Check( aOpt.GetUnitValidat() );
+    mpCbUnitValidat->SaveValue();
+
     // Separators
     OUString aSep = aOpt.GetFormulaSepArg();
     OUString aSepArrayRow = aOpt.GetFormulaSepArrayRow();
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index a22aff0..7220246 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -469,25 +469,28 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab,
             }
 
 #ifdef ENABLE_CALC_UNITVERIFICATION
-            boost::shared_ptr< Units > pUnits = Units::GetUnits();
-            FormulaStatus aStatus = pUnits->verifyFormula( pArr, aPos, pDoc );
-            if ( aStatus == FormulaStatus::VALID || aStatus == FormulaStatus::UNKNOWN )
+            if ( SC_MOD()->GetFormulaOptions().GetUnitValidat() )
             {
-                SAL_INFO( "sc.units", "verification successful" );
-
-                // If we have fixed a previously erronous cell we need to make sure we remove
-                // the associate warning infobar. It's simplest to simply call RemoveInfoBar
-                // with the hypothetical ID, and RemoveInfoBar deals with the remaning details.
-                // (The cell address is used as it's infobar id, see NotifyUnitErrorInFormula
-                // for further details.)
-                SfxViewFrame* pViewFrame = GetViewData().GetViewShell()->GetFrame();
-                OUString sAddress = aPos.Format( SCA_BITS, pDoc );
-                pViewFrame->RemoveInfoBar( sAddress );
-            }
-            else
-            {
-                SAL_INFO( "sc.units", "verification failed" );
-                NotifyUnitErrorInFormula( aPos, pDoc, aStatus );
+                boost::shared_ptr< Units > pUnits = Units::GetUnits();
+                FormulaStatus aStatus = pUnits->verifyFormula( pArr, aPos, pDoc );
+                if ( aStatus == FormulaStatus::VALID || aStatus == FormulaStatus::UNKNOWN )
+                {
+                    SAL_INFO( "sc.units", "verification successful" );
+
+                    // If we have fixed a previously erronous cell we need to make sure we remove
+                    // the associate warning infobar. It's simplest to simply call RemoveInfoBar
+                    // with the hypothetical ID, and RemoveInfoBar deals with the remaning details.
+                    // (The cell address is used as it's infobar id, see NotifyUnitErrorInFormula
+                    // for further details.)
+                    SfxViewFrame* pViewFrame = GetViewData().GetViewShell()->GetFrame();
+                    OUString sAddress = aPos.Format( SCA_BITS, pDoc );
+                    pViewFrame->RemoveInfoBar( sAddress );
+                }
+                else
+                {
+                    SAL_INFO( "sc.units", "verification failed" );
+                    NotifyUnitErrorInFormula( aPos, pDoc, aStatus );
+                }
             }
 #endif
         } while ( bAgain );
@@ -583,17 +586,21 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab,
             }
 
 #ifdef ENABLE_CALC_UNITVERIFICATION
-            boost::shared_ptr< Units > pUnits = Units::GetUnits();
+            if ( SC_MOD()->GetFormulaOptions().GetUnitValidat() )
+            {
+                boost::shared_ptr< Units > pUnits = Units::GetUnits();
 
-            OUString sHeaderUnit, sCellUnit;
-            ScAddress aHeaderAddress;
+                OUString sHeaderUnit, sCellUnit;
+                ScAddress aHeaderAddress;
 
-            if ( pUnits->isCellConversionRecommended( aAddress, pDoc, sHeaderUnit, aHeaderAddress, sCellUnit ) ) {
-                NotifyUnitConversionRecommended( aAddress, pDoc, sHeaderUnit, aHeaderAddress, sCellUnit, pDocSh );
-            } else {
-                SfxViewFrame* pViewFrame = GetViewData().GetViewShell()->GetFrame();
-                OUString sAddress = aAddress.Format( SCA_BITS, pDoc );
-                pViewFrame->RemoveInfoBar( sAddress );
+                if ( pUnits->isCellConversionRecommended( aAddress, pDoc, sHeaderUnit, aHeaderAddress, sCellUnit ) )
+                    NotifyUnitConversionRecommended( aAddress, pDoc, sHeaderUnit, aHeaderAddress, sCellUnit, pDocSh );
+                else
+                {
+                    SfxViewFrame* pViewFrame = GetViewData().GetViewShell()->GetFrame();
+                    OUString sAddress = aAddress.Format( SCA_BITS, pDoc );
+                    pViewFrame->RemoveInfoBar( sAddress );
+                }
             }
 #endif
         }
diff --git a/sc/uiconfig/scalc/ui/optformula.ui b/sc/uiconfig/scalc/ui/optformula.ui
index 4e66f81..2b63101 100644
--- a/sc/uiconfig/scalc/ui/optformula.ui
+++ b/sc/uiconfig/scalc/ui/optformula.ui
@@ -32,6 +32,23 @@
                 <property name="can_focus">False</property>
                 <property name="row_spacing">6</property>
                 <child>
+                  <object class="GtkCheckButton" id="unitvalidat">
+                    <property name="label" translatable="yes">Enable unit validation check</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">False</property>
+                    <property name="xalign">0</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">2</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+                <child>
                   <object class="GtkCheckButton" id="englishfuncname">
                     <property name="label" translatable="yes">Use English function names</property>
                     <property name="visible">True</property>


More information about the Libreoffice-commits mailing list