tdf#65872 [WIP] Allow prefered interpretation of pasted numbers to be saved

Change-Id: I065f1f8cff1b3c7d7198ce431df39a7b8cb7b593
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107402
Tested-by: Jenkins
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/sc/inc/scabstdlg.hxx b/sc/inc/scabstdlg.hxx
index e697150..0656ca1 100644
--- a/sc/inc/scabstdlg.hxx
+++ b/sc/inc/scabstdlg.hxx
@@ -393,6 +393,7 @@ protected:
public:
    virtual LanguageType GetLanguageType() const = 0;
    virtual bool IsDateConversionSet() const = 0;
    virtual bool IsKeepAskingSet() const = 0;
};

class ScAbstractDialogFactory
diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx b/sc/source/ui/attrdlg/scdlgfact.cxx
index 061db56..b77f603 100644
--- a/sc/source/ui/attrdlg/scdlgfact.cxx
+++ b/sc/source/ui/attrdlg/scdlgfact.cxx
@@ -876,6 +876,11 @@ bool AbstractScTextImportOptionsDlg_Impl::IsDateConversionSet() const
    return m_xDlg->isDateConversionSet();
}

bool AbstractScTextImportOptionsDlg_Impl::IsKeepAskingSet() const
{
    return m_xDlg->isKeepAskingSet();
}

BitmapEx AbstractScTextImportOptionsDlg_Impl::createScreenshot() const
{
    VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx b/sc/source/ui/attrdlg/scdlgfact.hxx
index 980b3f4..be01347 100644
--- a/sc/source/ui/attrdlg/scdlgfact.hxx
+++ b/sc/source/ui/attrdlg/scdlgfact.hxx
@@ -626,6 +626,7 @@ public:
    virtual short Execute() override;
    virtual LanguageType GetLanguageType() const override;
    virtual bool IsDateConversionSet() const override;
    virtual bool IsKeepAskingSet() const override;

    // screenshotting
    virtual BitmapEx createScreenshot() const override;
diff --git a/sc/source/ui/dbgui/textimportoptions.cxx b/sc/source/ui/dbgui/textimportoptions.cxx
index 63353d4..b8e99ca 100644
--- a/sc/source/ui/dbgui/textimportoptions.cxx
+++ b/sc/source/ui/dbgui/textimportoptions.cxx
@@ -31,6 +31,7 @@ ScTextImportOptionsDlg::ScTextImportOptionsDlg(weld::Window* pParent)
    , m_xRbAutomatic(m_xBuilder->weld_radio_button("automatic"))
    , m_xRbCustom(m_xBuilder->weld_radio_button("custom"))
    , m_xBtnConvertDate(m_xBuilder->weld_check_button("convertdata"))
    , m_xBtnKeepAsking(m_xBuilder->weld_check_button("keepasking"))
    , m_xLbCustomLang(new SvxLanguageBox(m_xBuilder->weld_combo_box("lang")))
{
    init();
@@ -53,6 +54,11 @@ bool ScTextImportOptionsDlg::isDateConversionSet() const
    return m_xBtnConvertDate->get_active();
}

bool ScTextImportOptionsDlg::isKeepAskingSet() const
{
    return m_xBtnKeepAsking->get_active();
}

void ScTextImportOptionsDlg::init()
{
    m_xBtnOk->connect_clicked(LINK(this, ScTextImportOptionsDlg, OKHdl));
diff --git a/sc/source/ui/inc/textimportoptions.hxx b/sc/source/ui/inc/textimportoptions.hxx
index 3b50655..78fd5cb 100644
--- a/sc/source/ui/inc/textimportoptions.hxx
+++ b/sc/source/ui/inc/textimportoptions.hxx
@@ -33,6 +33,7 @@ public:

    LanguageType getLanguageType() const;
    bool isDateConversionSet() const;
    bool isKeepAskingSet() const;

private:
    void init();
@@ -42,6 +43,7 @@ private:
    std::unique_ptr<weld::RadioButton> m_xRbAutomatic;
    std::unique_ptr<weld::RadioButton> m_xRbCustom;
    std::unique_ptr<weld::CheckButton> m_xBtnConvertDate;
    std::unique_ptr<weld::CheckButton> m_xBtnKeepAsking;
    std::unique_ptr<SvxLanguageBox> m_xLbCustomLang;

    DECL_LINK(OKHdl, weld::Button&, void);
diff --git a/sc/source/ui/view/viewfun5.cxx b/sc/source/ui/view/viewfun5.cxx
index 1773c2f..010febb 100644
--- a/sc/source/ui/view/viewfun5.cxx
+++ b/sc/source/ui/view/viewfun5.cxx
@@ -304,28 +304,50 @@ bool ScViewFunc::PasteDataFormat( SotClipboardFormatId nFormatId,
            tools::SvRef<SotTempStream> xStream;
            if ( aDataHelper.GetSotStorageStream( nFormatId, xStream ) && xStream.is() )
            {
                // Static variables for per-session storage. This could be
                // changed to longer-term storage in future.
                static bool bHaveSavedPreferences = false;
                static LanguageType eSavedLanguage;
                static bool bSavedDateConversion;

                if (nFormatId == SotClipboardFormatId::HTML &&
                    !comphelper::LibreOfficeKit::isActive())
                {
                    // Launch the text import options dialog.  For now, we do
                    // this for html pasting only, but in the future it may
                    // make sense to do it for other data types too.
                    ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
                    vcl::Window* pParent = GetActiveWin();
                    ScopedVclPtr<AbstractScTextImportOptionsDlg> pDlg(
                        pFact->CreateScTextImportOptionsDlg(pParent ? pParent->GetFrameWeld() : nullptr));

                    if (pDlg->Execute() == RET_OK)
                    if (bHaveSavedPreferences)
                    {
                        ScAsciiOptions aOptions;
                        aOptions.SetLanguage(pDlg->GetLanguageType());
                        aOptions.SetDetectSpecialNumber(pDlg->IsDateConversionSet());
                        aOptions.SetLanguage(eSavedLanguage);
                        aOptions.SetDetectSpecialNumber(bSavedDateConversion);
                        pObj->SetExtOptions(aOptions);
                    }
                    else
                    {
                        // prevent error dialog for user cancel action
                        bRet = true;
                        // Launch the text import options dialog.  For now, we do
                        // this for html pasting only, but in the future it may
                        // make sense to do it for other data types too.
                        ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
                        vcl::Window* pParent = GetActiveWin();
                        ScopedVclPtr<AbstractScTextImportOptionsDlg> pDlg(
                            pFact->CreateScTextImportOptionsDlg(pParent ? pParent->GetFrameWeld() : nullptr));

                        if (pDlg->Execute() == RET_OK)
                        {
                            ScAsciiOptions aOptions;
                            aOptions.SetLanguage(pDlg->GetLanguageType());
                            aOptions.SetDetectSpecialNumber(pDlg->IsDateConversionSet());
                            if (!pDlg->IsKeepAskingSet())
                            {
                                bHaveSavedPreferences = true;
                                eSavedLanguage = pDlg->GetLanguageType();
                                bSavedDateConversion = pDlg->IsDateConversionSet();
                            }
                            pObj->SetExtOptions(aOptions);
                        }
                        else
                        {
                            // prevent error dialog for user cancel action
                            bRet = true;
                        }
                    }
                }
                if(!bRet)
diff --git a/sc/uiconfig/scalc/ui/textimportoptions.ui b/sc/uiconfig/scalc/ui/textimportoptions.ui
index eead142..f09e0b0 100644
--- a/sc/uiconfig/scalc/ui/textimportoptions.ui
+++ b/sc/uiconfig/scalc/ui/textimportoptions.ui
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<!-- Generated with glade 3.22.2 -->
<interface domain="sc">
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkDialog" id="TextImportOptionsDialog">
@@ -10,7 +10,7 @@
    <property name="default_width">0</property>
    <property name="default_height">0</property>
    <property name="type_hint">dialog</property>
    <child>
    <child type="titlebar">
      <placeholder/>
    </child>
    <child internal-child="vbox">
@@ -53,12 +53,13 @@
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="help">
                <property name="label" translatable="yes" context="stock">_Help</property>
              <object class="GtkCheckButton" id="keepasking">
                <property name="label" translatable="yes" context="textimportoptions|keepasking">Keep asking during this session</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use-underline">True</property>
                <property name="can-focus">True</property>
                <property name="receives-default">False</property>
                <property name="active">True</property>
                <property name="draw-indicator">True</property>
              </object>
              <packing>
                <property name="expand">False</property>
@@ -204,7 +205,6 @@
    <action-widgets>
      <action-widget response="-5">ok</action-widget>
      <action-widget response="-6">cancel</action-widget>
      <action-widget response="-11">help</action-widget>
    </action-widgets>
  </object>
</interface>