starmath: Graduate inline (visual) editing from experimental features

It has been experimental for as long as LibreOffice existed, lets make
it non-experimental but add an option to disable it. If it turns to be a
disaster, we can flip the option and disable it by default.

Change-Id: I63672c054d1ead269863079e7f9c118a44b3ba19
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156486
Tested-by: Jenkins
Reviewed-by: خالد حسني <khaled@libreoffice.org>
diff --git a/officecfg/registry/schema/org/openoffice/Office/Math.xcs b/officecfg/registry/schema/org/openoffice/Office/Math.xcs
index c4466e0..7c05263 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Math.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Math.xcs
@@ -297,6 +297,12 @@
      <info>
        <desc>Contains miscellaneous settings.</desc>
      </info>
      <prop oor:name="InlineEditEnable" oor:type="xs:boolean" oor:nillable="false">
        <info>
          <desc>Enables inline (visual) editing mode.</desc>
        </info>
        <value>true</value>
      </prop>
      <prop oor:name="IgnoreSpacesRight" oor:type="xs:boolean" oor:nillable="false">
        <info>
          <desc>Ignores spacing symbols at the end of a line.</desc>
diff --git a/starmath/inc/cfgitem.hxx b/starmath/inc/cfgitem.hxx
index c81e9d0..1dfbd3e 100644
--- a/starmath/inc/cfgitem.hxx
+++ b/starmath/inc/cfgitem.hxx
@@ -186,6 +186,8 @@ public:
    void SetSaveOnlyUsedSymbols(bool bVal);
    bool IsAutoCloseBrackets() const;
    void SetAutoCloseBrackets(bool bVal);
    bool IsInlineEditEnable() const;
    void SetInlineEditEnable(bool bVal);
    bool IsIgnoreSpacesRight() const;
    void SetIgnoreSpacesRight(bool bVal);
    bool IsAutoRedraw() const;
diff --git a/starmath/inc/dialog.hxx b/starmath/inc/dialog.hxx
index ad28392..bed55f9 100644
--- a/starmath/inc/dialog.hxx
+++ b/starmath/inc/dialog.hxx
@@ -46,6 +46,7 @@ class SmPrintOptionsTabPage final : public SfxTabPage
    std::unique_ptr<weld::RadioButton>      m_xSizeScaled;
    std::unique_ptr<weld::RadioButton>      m_xSizeZoomed;
    std::unique_ptr<weld::MetricSpinButton> m_xZoom;
    std::unique_ptr<weld::CheckButton>      m_xEnableInlineEdit;
    std::unique_ptr<weld::CheckButton>      m_xNoRightSpaces;
    std::unique_ptr<weld::CheckButton>      m_xSaveOnlyUsedSymbols;
    std::unique_ptr<weld::CheckButton>      m_xAutoCloseBrackets;
diff --git a/starmath/inc/starmath.hrc b/starmath/inc/starmath.hrc
index 378aca8b..1127e66 100644
--- a/starmath/inc/starmath.hrc
+++ b/starmath/inc/starmath.hrc
@@ -73,5 +73,6 @@ class SfxUInt16Item;
#define SID_AUTO_CLOSE_BRACKETS     TypedWhichId<SfxBoolItem>(SID_SMA_START + 127)
#define SID_SMEDITWINDOWZOOM        TypedWhichId<SfxUInt16Item>(SID_SMA_START + 129)
#define SID_DEFAULT_SM_SYNTAX_VERSION TypedWhichId<SfxUInt16Item>(SID_SMA_START + 130)
#define SID_INLINE_EDIT_ENABLE      TypedWhichId<SfxBoolItem>(SID_SMA_START + 131)

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/starmath/source/cfgitem.cxx b/starmath/source/cfgitem.cxx
index 3bf170c..2146c36 100644
--- a/starmath/source/cfgitem.cxx
+++ b/starmath/source/cfgitem.cxx
@@ -73,6 +73,7 @@ static Sequence<OUString> lcl_GetOtherPropertyNames()
                               "Misc/AutoCloseBrackets",
                               "Misc/DefaultSmSyntaxVersion",
                               "Misc/IgnoreSpacesRight",
                               "Misc/InlineEditEnable",
                               "Misc/SmEditWindowZoomFactor",
                               "Print/FormulaText",
                               "Print/Frame",
@@ -144,6 +145,7 @@ struct SmCfgOther
    bool            bPrintFrame;
    bool            bIsSaveOnlyUsedSymbols;
    bool            bIsAutoCloseBrackets;
    bool            bInlineEditEnable;
    bool            bIgnoreSpacesRight;
    bool            bToolboxVisible;
    bool            bAutoRedraw;
@@ -165,6 +167,7 @@ SmCfgOther::SmCfgOther()
    , bPrintFrame(true)
    , bIsSaveOnlyUsedSymbols(true)
    , bIsAutoCloseBrackets(true)
    , bInlineEditEnable(true)
    , bIgnoreSpacesRight(true)
    , bToolboxVisible(true)
    , bAutoRedraw(true)
@@ -793,6 +796,10 @@ void SmMathConfig::LoadOther()
    if (sal_Int16 nTmp; pVal->hasValue() && (*pVal >>= nTmp))
        pOther->nSmSyntaxVersion = nTmp;
    ++pVal;
    // Misc/InlineEditEnable
    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
        pOther->bInlineEditEnable = bTmp;
    ++pVal;
    // Misc/IgnoreSpacesRight
    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
        pOther->bIgnoreSpacesRight = bTmp;
@@ -856,6 +863,8 @@ void SmMathConfig::SaveOther()
    *pVal++ <<= pOther->bIsAutoCloseBrackets;
    // Misc/DefaultSmSyntaxVersion
    *pVal++ <<= pOther->nSmSyntaxVersion;
    // Misc/InlineEditEnable
    *pVal++ <<= pOther->bInlineEditEnable;
    // Misc/IgnoreSpacesRight
    *pVal++ <<= pOther->bIgnoreSpacesRight;
    // Misc/SmEditWindowZoomFactor
@@ -1293,6 +1302,27 @@ void SmMathConfig::SetDefaultSmSyntaxVersion( sal_uInt16 nVal )
    }
}

bool SmMathConfig::IsInlineEditEnable() const
{
    if (utl::ConfigManager::IsFuzzing())
        return false;
    if (!pOther)
        const_cast<SmMathConfig*>(this)->LoadOther();
    return pOther->bInlineEditEnable;
}


void SmMathConfig::SetInlineEditEnable( bool bVal )
{
    if (!pOther)
        LoadOther();
    if (SetOtherIfNotEqual( pOther->bInlineEditEnable, bVal ))
    {
        // reformat (displayed) formulas accordingly
        Broadcast(SfxHint(SfxHintId::MathFormatChanged));
    }
}

bool SmMathConfig::IsIgnoreSpacesRight() const
{
    if (utl::ConfigManager::IsFuzzing())
@@ -1389,6 +1419,10 @@ void SmMathConfig::ItemSetToConfig(const SfxItemSet &rSet)
    {   bVal = pRedrawItem->GetValue();
        SetAutoRedraw( bVal );
    }
    if (const SfxBoolItem* pSpacesItem = rSet.GetItemIfSet(SID_INLINE_EDIT_ENABLE))
    {   bVal = pSpacesItem->GetValue();
        SetInlineEditEnable( bVal );
    }
    if (const SfxBoolItem* pSpacesItem = rSet.GetItemIfSet(SID_NO_RIGHT_SPACES))
    {   bVal = pSpacesItem->GetValue();
        SetIgnoreSpacesRight( bVal );
@@ -1425,6 +1459,7 @@ void SmMathConfig::ConfigToItemSet(SfxItemSet &rSet) const
    rSet.Put(SfxBoolItem(SID_PRINTTEXT,  IsPrintFormulaText()));
    rSet.Put(SfxBoolItem(SID_PRINTFRAME, IsPrintFrame()));
    rSet.Put(SfxBoolItem(SID_AUTOREDRAW, IsAutoRedraw()));
    rSet.Put(SfxBoolItem(SID_INLINE_EDIT_ENABLE, IsInlineEditEnable()));
    rSet.Put(SfxBoolItem(SID_NO_RIGHT_SPACES, IsIgnoreSpacesRight()));
    rSet.Put(SfxBoolItem(SID_SAVE_ONLY_USED_SYMBOLS, IsSaveOnlyUsedSymbols()));
    rSet.Put(SfxBoolItem(SID_AUTO_CLOSE_BRACKETS, IsAutoCloseBrackets()));
diff --git a/starmath/source/dialog.cxx b/starmath/source/dialog.cxx
index a377e59..8625072 100644
--- a/starmath/source/dialog.cxx
+++ b/starmath/source/dialog.cxx
@@ -167,6 +167,7 @@ SmPrintOptionsTabPage::SmPrintOptionsTabPage(weld::Container* pPage, weld::Dialo
    , m_xSizeScaled(m_xBuilder->weld_radio_button("sizescaled"))
    , m_xSizeZoomed(m_xBuilder->weld_radio_button("sizezoomed"))
    , m_xZoom(m_xBuilder->weld_metric_spin_button("zoom", FieldUnit::PERCENT))
    , m_xEnableInlineEdit(m_xBuilder->weld_check_button("enableinlineedit"))
    , m_xNoRightSpaces(m_xBuilder->weld_check_button("norightspaces"))
    , m_xSaveOnlyUsedSymbols(m_xBuilder->weld_check_button("saveonlyusedsymbols"))
    , m_xAutoCloseBrackets(m_xBuilder->weld_check_button("autoclosebrackets"))
@@ -223,6 +224,7 @@ bool SmPrintOptionsTabPage::FillItemSet(SfxItemSet* rSet)
    rSet->Put(SfxBoolItem(SID_PRINTTITLE, m_xTitle->get_active()));
    rSet->Put(SfxBoolItem(SID_PRINTTEXT, m_xText->get_active()));
    rSet->Put(SfxBoolItem(SID_PRINTFRAME, m_xFrame->get_active()));
    rSet->Put(SfxBoolItem(SID_INLINE_EDIT_ENABLE, m_xEnableInlineEdit->get_active()));
    rSet->Put(SfxBoolItem(SID_NO_RIGHT_SPACES, m_xNoRightSpaces->get_active()));
    rSet->Put(SfxBoolItem(SID_SAVE_ONLY_USED_SYMBOLS, m_xSaveOnlyUsedSymbols->get_active()));
    rSet->Put(SfxBoolItem(SID_AUTO_CLOSE_BRACKETS, m_xAutoCloseBrackets->get_active()));
@@ -251,6 +253,7 @@ void SmPrintOptionsTabPage::Reset(const SfxItemSet* rSet)
    m_xSmZoom->set_value(rSet->Get(SID_SMEDITWINDOWZOOM).GetValue(), FieldUnit::PERCENT);

    m_xTitle->set_active(rSet->Get(SID_PRINTTITLE).GetValue());
    m_xEnableInlineEdit->set_active(rSet->Get(SID_INLINE_EDIT_ENABLE).GetValue());
    m_xNoRightSpaces->set_active(rSet->Get(SID_NO_RIGHT_SPACES).GetValue());
    m_xSaveOnlyUsedSymbols->set_active(rSet->Get(SID_SAVE_ONLY_USED_SYMBOLS).GetValue());
    m_xAutoCloseBrackets->set_active(rSet->Get(SID_AUTO_CLOSE_BRACKETS).GetValue());
diff --git a/starmath/source/document.cxx b/starmath/source/document.cxx
index cafd291..5c09cf4 100644
--- a/starmath/source/document.cxx
+++ b/starmath/source/document.cxx
@@ -476,7 +476,8 @@ Printer* SmDocShell::GetPrt()
        auto pOptions = std::make_unique<SfxItemSetFixed<
                SID_PRINTTITLE, SID_PRINTZOOM,
                SID_NO_RIGHT_SPACES, SID_SAVE_ONLY_USED_SYMBOLS,
                SID_AUTO_CLOSE_BRACKETS, SID_SMEDITWINDOWZOOM>>(GetPool());
                SID_AUTO_CLOSE_BRACKETS, SID_SMEDITWINDOWZOOM,
                SID_INLINE_EDIT_ENABLE, SID_INLINE_EDIT_ENABLE>>(GetPool());
        SmModule *pp = SM_MOD();
        pp->GetConfig()->ConfigToItemSet(*pOptions);
        mpPrinter = VclPtr<SfxPrinter>::Create(std::move(pOptions));
diff --git a/starmath/source/smmod.cxx b/starmath/source/smmod.cxx
index 934e609..5e8886e 100644
--- a/starmath/source/smmod.cxx
+++ b/starmath/source/smmod.cxx
@@ -211,7 +211,8 @@ std::optional<SfxItemSet> SmModule::CreateItemSet( sal_uInt16 nId )
            svl::Items< //TP_SMPRINT
                SID_PRINTTITLE, SID_PRINTZOOM,
                SID_NO_RIGHT_SPACES, SID_SAVE_ONLY_USED_SYMBOLS,
                SID_AUTO_CLOSE_BRACKETS, SID_SMEDITWINDOWZOOM>);
                SID_AUTO_CLOSE_BRACKETS, SID_SMEDITWINDOWZOOM,
                SID_INLINE_EDIT_ENABLE, SID_INLINE_EDIT_ENABLE>);

        GetConfig()->ConfigToItemSet(*pRet);
    }
diff --git a/starmath/source/unomodel.cxx b/starmath/source/unomodel.cxx
index a75dfe6..c3a5bc1 100644
--- a/starmath/source/unomodel.cxx
+++ b/starmath/source/unomodel.cxx
@@ -600,7 +600,8 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* 
                    SID_PRINTZOOM,       SID_PRINTZOOM,
                    SID_NO_RIGHT_SPACES, SID_NO_RIGHT_SPACES,
                    SID_SAVE_ONLY_USED_SYMBOLS, SID_SAVE_ONLY_USED_SYMBOLS,
                    SID_AUTO_CLOSE_BRACKETS,    SID_SMEDITWINDOWZOOM>> ( SmDocShell::GetPool() );
                    SID_AUTO_CLOSE_BRACKETS,    SID_SMEDITWINDOWZOOM,
                    SID_INLINE_EDIT_ENABLE, SID_INLINE_EDIT_ENABLE>> ( SmDocShell::GetPool() );
                SmModule *pp = SM_MOD();
                pp->GetConfig()->ConfigToItemSet(*pItemSet);
                VclPtr<SfxPrinter> pPrinter = SfxPrinter::Create ( aStream, std::move(pItemSet) );
diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx
index 1a1a236..3e1e490 100644
--- a/starmath/source/view.cxx
+++ b/starmath/source/view.cxx
@@ -2334,7 +2334,7 @@ void SmViewShell::Notify( SfxBroadcaster& , const SfxHint& rHint )
bool SmViewShell::IsInlineEditEnabled()
{
    return comphelper::LibreOfficeKit::isActive()
           || officecfg::Office::Common::Misc::ExperimentalMode::get();
           || SM_MOD()->GetConfig()->IsInlineEditEnable();
}

void SmViewShell::StartMainHelp()
diff --git a/starmath/uiconfig/smath/ui/smathsettings.ui b/starmath/uiconfig/smath/ui/smathsettings.ui
index d3908d7..ae9adb6 100644
--- a/starmath/uiconfig/smath/ui/smathsettings.ui
+++ b/starmath/uiconfig/smath/ui/smathsettings.ui
@@ -253,6 +253,21 @@
            <property name="orientation">vertical</property>
            <property name="spacing">6</property>
            <child>
              <object class="GtkCheckButton" id="enableinlineedit">
                <property name="label" translatable="yes" context="smathsettings|enableinlineedit">Enable visual editing</property>
                <property name="visible">True</property>
                <property name="can-focus">True</property>
                <property name="receives-default">False</property>
                <property name="use-underline">True</property>
                <property name="draw-indicator">True</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkCheckButton" id="norightspaces">
                <property name="label" translatable="yes" context="smathsettings|norightspaces">Ig_nore ~~ and ' at the end of the line</property>
                <property name="visible">True</property>
@@ -269,7 +284,7 @@
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
                <property name="position">1</property>
              </packing>
            </child>
            <child>
@@ -289,7 +304,7 @@
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">1</property>
                <property name="position">2</property>
              </packing>
            </child>
            <child>
@@ -304,7 +319,7 @@
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">2</property>
                <property name="position">3</property>
              </packing>
            </child>
            <child>