summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiddhant Chaudhary <urssidd@gmail.com>2022-05-29 14:52:58 +0530
committerHeiko Tietze <heiko.tietze@documentfoundation.org>2022-06-21 15:02:22 +0200
commit9d0ca8ee3f0c2a4e6c0bebec6ef1523cd04e849a (patch)
treebb6c603c4aea6d21219ba660056b4740130d685c
parent36d3fa20a5e0ebd7d3befd789a6930c777972e8c (diff)
tdf#69750 Preserve last used Paste Special options for next session.
This feature stores the Paste Special options for Calc in the LO registry for use across sessions, so that users don't have to set options everytime they start a new Calc session. A new group named "PasteSpecial" has been added in `officecfg/registry/schema/org/openoffice/Office/Common.xcs`. The function `ScInsertContentsDlg::storeFlagsInRegistry()` has been added, which is responsible for storing the state whenever the dialog is closed by clicking either the OK button, or one of the four shortcut buttons. Also, whenever the dialog is opened for the first time in a new session (represented by the `firstLoad` boolean flag), the options are loaded from the registry. Change-Id: Icc879b11feb5bfe32777b6e548d9c0804d93a33e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135110 Tested-by: Jenkins Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/Common.xcs137
-rw-r--r--sc/source/ui/inc/inscodlg.hxx3
-rw-r--r--sc/source/ui/miscdlgs/inscodlg.cxx140
-rw-r--r--sc/uiconfig/scalc/ui/pastespecial.ui1
4 files changed, 278 insertions, 3 deletions
diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
index 73b1acbe871d..8dd15b7ca8c7 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Common.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
@@ -6599,5 +6599,142 @@
<value>true</value>
</prop>
</group>
+ <group oor:name="PasteSpecial">
+ <info>
+ <desc>Stores properties related to the paste special feature in Calc.</desc>
+ </info>
+ <group oor:name="Paste">
+ <info>
+ <desc>Stores options under the "Paste" section.</desc>
+ </info>
+ <prop oor:name="All" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option to set all options.</desc>
+ </info>
+ <value>false</value>
+ </prop>
+ <prop oor:name="Numbers" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for numbers.</desc>
+ </info>
+ <value>true</value>
+ </prop>
+ <prop oor:name="Text" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for text.</desc>
+ </info>
+ <value>true</value>
+ </prop>
+ <prop oor:name="DateTime" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for date and time.</desc>
+ </info>
+ <value>true</value>
+ </prop>
+ <prop oor:name="Formats" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for formats.</desc>
+ </info>
+ <value>false</value>
+ </prop>
+ <prop oor:name="Comments" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for comments.</desc>
+ </info>
+ <value>false</value>
+ </prop>
+ <prop oor:name="Objects" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for objects.</desc>
+ </info>
+ <value>false</value>
+ </prop>
+ <prop oor:name="Formulas" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for formulas.</desc>
+ </info>
+ <value>false</value>
+ </prop>
+ </group>
+ <prop oor:name="ShiftCells" oor:type="xs:int" oor:nillable="false">
+ <info>
+ <desc>Stores the option to be used for the "Shift Cells" section.</desc>
+ </info>
+ <constraints>
+ <enumeration oor:value="0">
+ <info>
+ <desc>Shift cells down (`InsCellCmd::INS_CELLSDOWN`).</desc>
+ </info>
+ </enumeration>
+ <enumeration oor:value="1">
+ <info>
+ <desc>Shift cells right (`InsCellCmd::INS_CELLSRIGHT`).</desc>
+ </info>
+ </enumeration>
+ <enumeration oor:value="4">
+ <info>
+ <desc>None (`InsCellCmd::INS_NONE`). This is the default value.</desc>
+ </info>
+ </enumeration>
+ </constraints>
+ <value>4</value>
+ </prop>
+ <group oor:name="Options">
+ <info>
+ <desc>Stores options under the "Options" section.</desc>
+ </info>
+ <prop oor:name="AsLink" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for as link.</desc>
+ </info>
+ <value>false</value>
+ </prop>
+ <prop oor:name="Transpose" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for transpose.</desc>
+ </info>
+ <value>false</value>
+ </prop>
+ <prop oor:name="SkipEmptyCells" oor:type="xs:boolean" oor:nillable="false">
+ <info>
+ <desc>Option for skipping empty cells.</desc>
+ </info>
+ <value>false</value>
+ </prop>
+ </group>
+ <prop oor:name="Operations" oor:type="xs:int" oor:nillable="false">
+ <info>
+ <desc>Stores the option to be used for the "Operations" section.</desc>
+ </info>
+ <constraints>
+ <enumeration oor:value="0">
+ <info>
+ <desc>No operation (`ScPasteFunc::NONE`). This is the default value.</desc>
+ </info>
+ </enumeration>
+ <enumeration oor:value="1">
+ <info>
+ <desc>Add (`ScPasteFunc::ADD`).</desc>
+ </info>
+ </enumeration>
+ <enumeration oor:value="2">
+ <info>
+ <desc>Subtract (`ScPasteFunc::SUB`).</desc>
+ </info>
+ </enumeration>
+ <enumeration oor:value="3">
+ <info>
+ <desc>Multiply (`ScPasteFunc::MUL`).</desc>
+ </info>
+ </enumeration>
+ <enumeration oor:value="4">
+ <info>
+ <desc>Divide (`ScPasteFunc::DIV`).</desc>
+ </info>
+ </enumeration>
+ </constraints>
+ <value>0</value>
+ </prop>
+ </group>
</component>
</oor:component-schema>
diff --git a/sc/source/ui/inc/inscodlg.hxx b/sc/source/ui/inc/inscodlg.hxx
index a30cffe0b355..31577f832eef 100644
--- a/sc/source/ui/inc/inscodlg.hxx
+++ b/sc/source/ui/inc/inscodlg.hxx
@@ -43,6 +43,7 @@ public:
void SetFillMode( bool bSet );
void SetChangeTrack( bool bSet );
void SetCellShiftDisabled( CellShiftDisabledFlags nDisable );
+ void storeFlagsInRegistry();
private:
bool bOtherDoc;
@@ -82,6 +83,7 @@ private:
std::unique_ptr<weld::Button> mxBtnShortCutPasteValuesFormats;
std::unique_ptr<weld::Button> mxBtnShortCutPasteTranspose;
std::unique_ptr<weld::Button> mxBtnShortCutPasteFormats;
+ std::unique_ptr<weld::Button> mxOKBtn;
std::unique_ptr<weld::CheckButton> mxImmediately;
@@ -97,6 +99,7 @@ private:
DECL_LINK( InsAllHdl, weld::Toggleable&, void );
DECL_LINK( LinkBtnHdl, weld::Toggleable&, void );
DECL_LINK( ShortCutHdl, weld::Button&, void );
+ DECL_LINK( ClickHdl, weld::Button&, void );
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/miscdlgs/inscodlg.cxx b/sc/source/ui/miscdlgs/inscodlg.cxx
index 879ed28354f3..ca4fd1cfa8bd 100644
--- a/sc/source/ui/miscdlgs/inscodlg.cxx
+++ b/sc/source/ui/miscdlgs/inscodlg.cxx
@@ -20,12 +20,59 @@
#undef SC_DLLIMPLEMENTATION
#include <inscodlg.hxx>
+#include <officecfg/Office/Common.hxx>
-InsertDeleteFlags ScInsertContentsDlg::nPreviousChecks = InsertDeleteFlags::VALUE | InsertDeleteFlags::DATETIME | InsertDeleteFlags::STRING;
+InsertDeleteFlags ScInsertContentsDlg::nPreviousChecks = InsertDeleteFlags::NONE;
ScPasteFunc ScInsertContentsDlg::nPreviousFormulaChecks = ScPasteFunc::NONE;
InsertContentsFlags ScInsertContentsDlg::nPreviousChecks2 = InsertContentsFlags::NONE;
InsCellCmd ScInsertContentsDlg::nPreviousMoveMode = InsCellCmd::INS_NONE;
+//whether the dialog has loaded for the first time
+static bool firstLoad = true;
+
+void ScInsertContentsDlg::storeFlagsInRegistry()
+{
+ //store the flags in the registry
+ std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
+
+ //InsertDeleteFlags
+ officecfg::Office::Common::PasteSpecial::Paste::All::set(ScInsertContentsDlg::mxBtnInsAll->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Paste::Numbers::set(ScInsertContentsDlg::mxBtnInsNumbers->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Paste::Text::set(ScInsertContentsDlg::mxBtnInsStrings->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Paste::DateTime::set(ScInsertContentsDlg::mxBtnInsDateTime->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Paste::Formats::set(ScInsertContentsDlg::mxBtnInsAttrs->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Paste::Comments::set(ScInsertContentsDlg::mxBtnInsNotes->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Paste::Objects::set(ScInsertContentsDlg::mxBtnInsObjects->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Paste::Formulas::set(ScInsertContentsDlg::mxBtnInsFormulas->get_active(), batch);
+
+ //ScPasteFunc
+ if(ScInsertContentsDlg::mxRbNoOp->get_active())
+ officecfg::Office::Common::PasteSpecial::Operations::set(0, batch);
+ else if(ScInsertContentsDlg::mxRbAdd->get_active())
+ officecfg::Office::Common::PasteSpecial::Operations::set(1, batch);
+ else if(ScInsertContentsDlg::mxRbSub->get_active())
+ officecfg::Office::Common::PasteSpecial::Operations::set(2, batch);
+ else if(ScInsertContentsDlg::mxRbMul->get_active())
+ officecfg::Office::Common::PasteSpecial::Operations::set(3, batch);
+ else if(ScInsertContentsDlg::mxRbDiv->get_active())
+ officecfg::Office::Common::PasteSpecial::Operations::set(4, batch);
+
+ //InsertContentsFlags
+ officecfg::Office::Common::PasteSpecial::Options::AsLink::set(ScInsertContentsDlg::mxBtnLink->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Options::Transpose::set(ScInsertContentsDlg::mxBtnTranspose->get_active(), batch);
+ officecfg::Office::Common::PasteSpecial::Options::SkipEmptyCells::set(ScInsertContentsDlg::mxBtnSkipEmptyCells->get_active(), batch);
+
+ //InsCellCmd
+ if(ScInsertContentsDlg::mxRbMoveNone->get_active())
+ officecfg::Office::Common::PasteSpecial::ShiftCells::set(4, batch);
+ else if(ScInsertContentsDlg::mxRbMoveDown->get_active())
+ officecfg::Office::Common::PasteSpecial::ShiftCells::set(0, batch);
+ else if(ScInsertContentsDlg::mxRbMoveRight->get_active())
+ officecfg::Office::Common::PasteSpecial::ShiftCells::set(1, batch);
+
+ batch->commit();
+}
+
ScInsertContentsDlg::ScInsertContentsDlg(weld::Window* pParent,
const OUString* pStrTitle )
: GenericDialogController(pParent, "modules/scalc/ui/pastespecial.ui", "PasteSpecial")
@@ -57,11 +104,88 @@ ScInsertContentsDlg::ScInsertContentsDlg(weld::Window* pParent,
, mxBtnShortCutPasteValuesFormats(m_xBuilder->weld_button("paste_values_formats"))
, mxBtnShortCutPasteTranspose(m_xBuilder->weld_button("paste_transpose"))
, mxBtnShortCutPasteFormats(m_xBuilder->weld_button("paste_formats"))
+ , mxOKBtn(m_xBuilder->weld_button("ok"))
, mxImmediately(m_xBuilder->weld_check_button("cbImmediately"))
{
if (pStrTitle)
m_xDialog->set_title(*pStrTitle);
+ if (firstLoad)
+ {
+ //unset firstLoad
+ firstLoad = false;
+
+ //set the flags from the registry
+
+ /*
+ * Flags for nPreviousChecks
+ */
+ if(officecfg::Office::Common::PasteSpecial::Paste::All::get())
+ nPreviousChecks |= InsertDeleteFlags::ALL;
+ if(officecfg::Office::Common::PasteSpecial::Paste::Numbers::get())
+ nPreviousChecks |= InsertDeleteFlags::VALUE;
+ if(officecfg::Office::Common::PasteSpecial::Paste::Text::get())
+ nPreviousChecks |= InsertDeleteFlags::STRING;
+ if(officecfg::Office::Common::PasteSpecial::Paste::DateTime::get())
+ nPreviousChecks |= InsertDeleteFlags::DATETIME;
+ if(officecfg::Office::Common::PasteSpecial::Paste::Formats::get())
+ nPreviousChecks |= InsertDeleteFlags::ATTRIB;
+ if(officecfg::Office::Common::PasteSpecial::Paste::Comments::get())
+ nPreviousChecks |= InsertDeleteFlags::NOTE;
+ if(officecfg::Office::Common::PasteSpecial::Paste::Objects::get())
+ nPreviousChecks |= InsertDeleteFlags::OBJECTS;
+ if(officecfg::Office::Common::PasteSpecial::Paste::Formulas::get())
+ nPreviousChecks |= InsertDeleteFlags::FORMULA;
+
+ /*
+ * Flags for nPreviousFormulaChecks
+ */
+ int optionFlagValue = officecfg::Office::Common::PasteSpecial::Operations::get();
+ switch(optionFlagValue)
+ {
+ case 0: nPreviousFormulaChecks = ScPasteFunc::NONE;
+ break;
+
+ case 1: nPreviousFormulaChecks = ScPasteFunc::ADD;
+ break;
+
+ case 2: nPreviousFormulaChecks = ScPasteFunc::SUB;
+ break;
+
+ case 3: nPreviousFormulaChecks = ScPasteFunc::MUL;
+ break;
+
+ case 4: nPreviousFormulaChecks = ScPasteFunc::DIV;
+ break;
+ }
+
+ /*
+ * Flags for nPreviousChecks2
+ */
+ if(officecfg::Office::Common::PasteSpecial::Options::AsLink::get())
+ nPreviousChecks2 |= InsertContentsFlags::Link;
+ if(officecfg::Office::Common::PasteSpecial::Options::Transpose::get())
+ nPreviousChecks2 |= InsertContentsFlags::Trans;
+ if(officecfg::Office::Common::PasteSpecial::Options::SkipEmptyCells::get())
+ nPreviousChecks2 |= InsertContentsFlags::NoEmpty;
+
+ /*
+ * Flags for nPreviousMoveMode
+ */
+ int shiftFlagValue = officecfg::Office::Common::PasteSpecial::ShiftCells::get();
+ switch(shiftFlagValue)
+ {
+ case 0: nPreviousMoveMode = InsCellCmd::INS_CELLSDOWN;
+ break;
+
+ case 1: nPreviousMoveMode = InsCellCmd::INS_CELLSRIGHT;
+ break;
+
+ case 4: nPreviousMoveMode = InsCellCmd::INS_NONE;
+ break;
+ }
+ }
+
SetInsContentsCmdBits( ScInsertContentsDlg::nPreviousChecks );
SetFormulaCmdBits( ScInsertContentsDlg::nPreviousFormulaChecks );
SetCellCmdFlags( ScInsertContentsDlg::nPreviousMoveMode );
@@ -74,6 +198,7 @@ ScInsertContentsDlg::ScInsertContentsDlg(weld::Window* pParent,
mxBtnShortCutPasteValuesFormats->connect_clicked( LINK( this, ScInsertContentsDlg, ShortCutHdl ) );
mxBtnShortCutPasteTranspose->connect_clicked( LINK( this, ScInsertContentsDlg, ShortCutHdl ) );
mxBtnShortCutPasteFormats->connect_clicked( LINK( this, ScInsertContentsDlg, ShortCutHdl ) );
+ mxOKBtn->connect_clicked( LINK( this, ScInsertContentsDlg, ClickHdl ) );
}
InsertDeleteFlags ScInsertContentsDlg::GetInsContentsCmdBits() const
@@ -316,7 +441,18 @@ IMPL_LINK(ScInsertContentsDlg, ShortCutHdl, weld::Button&, rBtn, void)
SetCellCmdFlags( InsCellCmd::INS_NONE );
SetFormulaCmdBits(ScPasteFunc::NONE);
- if (mxImmediately->get_active()) m_xDialog->response(RET_OK);
+
+ if (mxImmediately->get_active())
+ {
+ storeFlagsInRegistry();
+ m_xDialog->response(RET_OK);
+ }
+}
+
+IMPL_LINK_NOARG(ScInsertContentsDlg, ClickHdl, weld::Button&, void)
+{
+ storeFlagsInRegistry();
+ m_xDialog->response(RET_OK);
}
IMPL_LINK_NOARG(ScInsertContentsDlg, InsAllHdl, weld::Toggleable&, void)
diff --git a/sc/uiconfig/scalc/ui/pastespecial.ui b/sc/uiconfig/scalc/ui/pastespecial.ui
index 83290dbf5db1..ccdfcbc8a46a 100644
--- a/sc/uiconfig/scalc/ui/pastespecial.ui
+++ b/sc/uiconfig/scalc/ui/pastespecial.ui
@@ -816,7 +816,6 @@
</object>
</child>
<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>