Added Sort Transformation in Data Provider dlg

Change-Id: I68ea3d2fc40163d0f3a67bb3723341f8e382db27
Reviewed-on: https://gerrit.libreoffice.org/56914
Tested-by: Jenkins
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk
index 498540b..424d630 100644
--- a/sc/UIConfig_scalc.mk
+++ b/sc/UIConfig_scalc.mk
@@ -157,6 +157,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/scalc,\
	sc/uiconfig/scalc/ui/mergecellsdialog \
	sc/uiconfig/scalc/ui/mergecolumnentry \
	sc/uiconfig/scalc/ui/texttransformationentry \
	sc/uiconfig/scalc/ui/sorttransformationentry \
	sc/uiconfig/scalc/ui/movecopysheet \
	sc/uiconfig/scalc/ui/movingaveragedialog \
	sc/uiconfig/scalc/ui/multipleoperationsdialog \
diff --git a/sc/source/ui/inc/dataproviderdlg.hxx b/sc/source/ui/inc/dataproviderdlg.hxx
index cd3f681..b39254d 100644
--- a/sc/source/ui/inc/dataproviderdlg.hxx
+++ b/sc/source/ui/inc/dataproviderdlg.hxx
@@ -62,6 +62,7 @@ public:
    void splitColumn();
    void mergeColumns();
    void textTransformation();
    void sortTransformation();

    void import(ScDocument* pDoc, bool bInternal = false);
};
diff --git a/sc/source/ui/miscdlgs/dataproviderdlg.cxx b/sc/source/ui/miscdlgs/dataproviderdlg.cxx
index c2ce2f6..e07f789 100644
--- a/sc/source/ui/miscdlgs/dataproviderdlg.cxx
+++ b/sc/source/ui/miscdlgs/dataproviderdlg.cxx
@@ -222,7 +222,8 @@ MenuData aColumnData[] = {
    { 0, "Delete Column", &ScDataProviderDlg::deleteColumn },
    { 1, "Split Column", &ScDataProviderDlg::splitColumn },
    { 2, "Merge Columns", &ScDataProviderDlg::mergeColumns },
    { 3, "Text Transformation", &ScDataProviderDlg::textTransformation }
    { 3, "Text Transformation", &ScDataProviderDlg::textTransformation },
    { 4, "Sort Columns", &ScDataProviderDlg::sortTransformation }
};

class ScDataTransformationBaseControl : public VclContainer,
@@ -436,6 +437,60 @@ std::shared_ptr<sc::DataTransformation> ScMergeColumnTransformationControl::getT
    return std::make_shared<sc::MergeColumnTransformation>(aMergedColumns, mpSeparator->GetText());
}

class ScSortTransformationControl : public ScDataTransformationBaseControl
{
private:

    VclPtr<CheckBox> mpAscending;
    VclPtr<Edit> mpEdColumns;

public:
    ScSortTransformationControl(vcl::Window* pParent);
    ~ScSortTransformationControl() override;

    virtual void dispose() override;

    virtual std::shared_ptr<sc::DataTransformation> getTransformation() override;
};

ScSortTransformationControl::ScSortTransformationControl(vcl::Window* pParent):
    ScDataTransformationBaseControl(pParent, "modules/scalc/ui/sorttransformationentry.ui")
{
    get(mpAscending, "ed_ascending");
    get(mpEdColumns, "ed_columns");
}

ScSortTransformationControl::~ScSortTransformationControl()
{
    disposeOnce();
}

void ScSortTransformationControl::dispose()
{
    mpAscending.clear();
    mpEdColumns.clear();

    ScDataTransformationBaseControl::dispose();
}

std::shared_ptr<sc::DataTransformation> ScSortTransformationControl::getTransformation()
{
    OUString aColStr = mpEdColumns->GetText();
    bool aIsAscending = mpAscending->IsChecked();
    SCCOL aColumn = 0;
    sal_Int32 nCol = aColStr.toInt32();
    if (nCol > 0 && nCol <= MAXCOL)
        aColumn = nCol - 1;     // translate from 1-based column notations to internal Calc one

    ScSortParam aSortParam;
    ScSortKeyState aSortKey;
    aSortKey.bDoSort = true;
    aSortKey.nField = aColumn;
    aSortKey.bAscending = aIsAscending;
    aSortParam.maKeyState.push_back(aSortKey);
    return std::make_shared<sc::SortTransformation>(aSortParam);
}

class ScColumnTextTransformation : public ScDataTransformationBaseControl
{
private:
@@ -660,6 +715,12 @@ void ScDataProviderDlg::textTransformation()
    mpList->addEntry(pTextTransforamtionEntry);
}

void ScDataProviderDlg::sortTransformation()
{
    VclPtr<ScSortTransformationControl> pSortTransforamtionEntry = VclPtr<ScSortTransformationControl>::Create(mpList);
    mpList->addEntry(pSortTransforamtionEntry);
}

void ScDataProviderDlg::import(ScDocument* pDoc, bool bInternal)
{
    sc::ExternalDataSource aSource = mpDataProviderCtrl->getDataSource(pDoc);
diff --git a/sc/uiconfig/scalc/ui/sorttransformationentry.ui b/sc/uiconfig/scalc/ui/sorttransformationentry.ui
new file mode 100644
index 0000000..070c0b4
--- /dev/null
+++ b/sc/uiconfig/scalc/ui/sorttransformationentry.ui
@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.2 -->
<interface domain="sc">
  <requires lib="gtk+" version="3.18"/>
  <object class="GtkGrid" id="grid">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="border_width">6</property>
    <property name="row_spacing">6</property>
    <property name="column_spacing">12</property>
    <child>
      <object class="GtkBox">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkLabel">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes" context="sorttransformationentry|name">Sort Transformation</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkGrid" id="grid_details">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkCheckButton" id="ed_ascending">
                <property name="visible">True</property>
                <property name="label" translatable="yes" context="sorttransformationentry|type">Ascending Order</property>
                <property name="can_focus">True</property>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkLabel" id="label1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes" context="sorttransformationentry|column">Column:</property>
                <accessibility>
                  <relation type="label-for" target="ed_columns"/>
                </accessibility>
              </object>
              <packing>
                <property name="left_attach">0</property>
                <property name="top_attach">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkEntry" id="ed_columns">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <accessibility>
                  <relation type="labelled-by" target="label1"/>
                </accessibility>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
      <packing>
        <property name="left_attach">0</property>
        <property name="top_attach">0</property>
      </packing>
    </child>
  </object>
</interface>