diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
index f9c0f237aaa6..6de8c2854e42 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
@@ -911,6 +911,17 @@
starshapes;.uno:StarShapes.star5
+
+
+ .uno:MailMergeCurrentEntry
+
+
+
+
+
+ lo.writer.MMCurrentEntryController
+
+
.uno:MailMergeExcludeEntry
diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
index 0bb0cd469725..bbb953e737c0 100644
--- a/sw/inc/cmdid.h
+++ b/sw/inc/cmdid.h
@@ -256,6 +256,7 @@
#define FN_MAILMERGE_PREV_ENTRY (FN_INSERT + 71) /* mail merge toolbar - go to the previous entry */
#define FN_MAILMERGE_NEXT_ENTRY (FN_INSERT + 72) /* mail merge toolbar - go to the next entry */
#define FN_MAILMERGE_LAST_ENTRY (FN_INSERT + 73) /* mail merge toolbar - go to the next entry */
+#define FN_MAILMERGE_CURRENT_ENTRY (FN_INSERT + 74) /* mail merge toolbar - show or change the current entry */
#define FN_MAILMERGE_EXCLUDE_ENTRY (FN_INSERT + 75) /* mail merge toolbar - checkbox to exclude the current entry */
#define FN_DRAWTEXT_ATTR_DLG (FN_INSERT + 76) /* position DrawText */
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index 7bc5b86c5948..3a8e31543291 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -3841,6 +3841,23 @@ SfxVoidItem MailMergeLastEntry FN_MAILMERGE_LAST_ENTRY
GroupId = GID_DOCUMENT;
]
+SfxVoidItem MailMergeCurrentEntry FN_MAILMERGE_CURRENT_ENTRY
+()
+[
+ AutoUpdate = TRUE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = TRUE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = GID_DOCUMENT;
+]
+
SfxVoidItem MailMergeExcludeEntry FN_MAILMERGE_EXCLUDE_ENTRY
()
[
diff --git a/sw/sdi/wrtapp.sdi b/sw/sdi/wrtapp.sdi
index 6ead72816f89..c13ee75304c9 100644
--- a/sw/sdi/wrtapp.sdi
+++ b/sw/sdi/wrtapp.sdi
@@ -86,6 +86,12 @@ interface StarWriter
StateMethod = StateOther ;
]
+ FN_MAILMERGE_CURRENT_ENTRY
+ [
+ ExecMethod = ExecOther ;
+ StateMethod = StateOther ;
+ ]
+
FN_MAILMERGE_EXCLUDE_ENTRY
[
StateMethod = StateOther ;
diff --git a/sw/source/uibase/app/apphdl.cxx b/sw/source/uibase/app/apphdl.cxx
index 575ddc319bd0..e99dcc8bfb30 100644
--- a/sw/source/uibase/app/apphdl.cxx
+++ b/sw/source/uibase/app/apphdl.cxx
@@ -225,9 +225,11 @@ void SwModule::StateOther(SfxItemSet &rSet)
}
}
break;
+ case FN_MAILMERGE_CURRENT_ENTRY:
case FN_MAILMERGE_EXCLUDE_ENTRY:
{
// just trigger calling statusChanged() of MMExcludeEntryController
+ // resp. MMCurrentEntryController
rSet.InvalidateItem(nWhich);
}
break;
@@ -751,6 +753,7 @@ void SwModule::ExecOther(SfxRequest& rReq)
case FN_MAILMERGE_PREV_ENTRY:
case FN_MAILMERGE_NEXT_ENTRY:
case FN_MAILMERGE_LAST_ENTRY:
+ case FN_MAILMERGE_CURRENT_ENTRY:
{
SwView* pView = ::GetActiveView();
SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem();
@@ -764,6 +767,7 @@ void SwModule::ExecOther(SfxRequest& rReq)
case FN_MAILMERGE_PREV_ENTRY: pConfigItem->MoveResultSet(nPos - 1); break;
case FN_MAILMERGE_NEXT_ENTRY: pConfigItem->MoveResultSet(nPos + 1); break;
case FN_MAILMERGE_LAST_ENTRY: pConfigItem->MoveResultSet(-1); break;
+ case FN_MAILMERGE_CURRENT_ENTRY: /* don't move the result set, just update the document */ break;
default: break;
}
@@ -790,6 +794,7 @@ void SwModule::ExecOther(SfxRequest& rReq)
rBindings.Invalidate(FN_MAILMERGE_PREV_ENTRY);
rBindings.Invalidate(FN_MAILMERGE_NEXT_ENTRY);
rBindings.Invalidate(FN_MAILMERGE_LAST_ENTRY);
+ rBindings.Invalidate(FN_MAILMERGE_CURRENT_ENTRY);
rBindings.Invalidate(FN_MAILMERGE_EXCLUDE_ENTRY);
rBindings.Update();
}
diff --git a/sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx b/sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx
index d4dacfb32f10..749d65f86b05 100644
--- a/sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx
+++ b/sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx
@@ -36,6 +36,74 @@ using namespace css;
namespace {
+/// Controller for .uno:MailMergeCurrentEntry toolbar checkbox: creates the checkbox & handles the value.
+class MMCurrentEntryController : public svt::ToolboxController, public lang::XServiceInfo
+{
+ VclPtr m_pCurrentEdit;
+
+ DECL_LINK_TYPED(CurrentEditUpdatedHdl, Edit&, void);
+
+public:
+ MMCurrentEntryController(const uno::Reference& rContext)
+ : svt::ToolboxController(rContext, uno::Reference(), OUString(".uno:MailMergeCurrentEntry"))
+ , m_pCurrentEdit(nullptr)
+ {
+ }
+
+ virtual ~MMCurrentEntryController()
+ {
+ }
+
+ // XInterface
+ virtual uno::Any SAL_CALL queryInterface(const uno::Type& aType) throw (uno::RuntimeException, std::exception) override
+ {
+ uno::Any a(ToolboxController::queryInterface(aType));
+ if (a.hasValue())
+ return a;
+
+ return ::cppu::queryInterface(aType, static_cast(this));
+ }
+
+ void SAL_CALL acquire() throw ()
+ {
+ ToolboxController::acquire();
+ }
+
+ void SAL_CALL release() throw ()
+ {
+ ToolboxController::release();
+ }
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() throw (uno::RuntimeException, std::exception) override
+ {
+ return OUString("lo.writer.MMCurrentEntryController");
+ }
+
+ virtual sal_Bool SAL_CALL supportsService(const OUString& rServiceName) throw (uno::RuntimeException, std::exception) override
+ {
+ return cppu::supportsService(this, rServiceName);
+ }
+
+ virtual uno::Sequence SAL_CALL getSupportedServiceNames() throw (uno::RuntimeException, std::exception) override
+ {
+ uno::Sequence aServices { "com.sun.star.frame.ToolbarController" };
+ return aServices;
+ }
+
+ // XComponent
+ virtual void SAL_CALL dispose() throw (uno::RuntimeException, std::exception) override;
+
+ // XInitialization
+ virtual void SAL_CALL initialize(const uno::Sequence< uno::Any >& aArguments) throw (uno::Exception, uno::RuntimeException, std::exception) override;
+
+ // XToolbarController
+ virtual uno::Reference SAL_CALL createItemWindow(const uno::Reference& rParent) throw (uno::RuntimeException, std::exception) override;
+
+ // XStatusListener
+ virtual void SAL_CALL statusChanged(const frame::FeatureStateEvent& rEvent) throw (uno::RuntimeException, std::exception) override;
+};
+
/// Controller for .uno:MailMergeExcludeEntry toolbar checkbox: creates the checkbox & handles the value.
class MMExcludeEntryController : public svt::ToolboxController, public lang::XServiceInfo
{
@@ -104,6 +172,78 @@ public:
virtual void SAL_CALL statusChanged(const frame::FeatureStateEvent& rEvent) throw (uno::RuntimeException, std::exception) override;
};
+void MMCurrentEntryController::dispose() throw (uno::RuntimeException, std::exception)
+{
+ SolarMutexGuard aSolarMutexGuard;
+
+ svt::ToolboxController::dispose();
+ m_pCurrentEdit.disposeAndClear();
+}
+
+void MMCurrentEntryController::initialize(const uno::Sequence< uno::Any >& aArguments) throw (uno::Exception, uno::RuntimeException, std::exception)
+{
+ svt::ToolboxController::initialize(aArguments);
+}
+
+uno::Reference MMCurrentEntryController::createItemWindow(const uno::Reference& rParent) throw (uno::RuntimeException, std::exception)
+{
+ vcl::Window* pParent = VCLUnoHelper::GetWindow(rParent);
+ ToolBox* pToolbar = dynamic_cast(pParent);
+ if (pToolbar)
+ {
+ // make it visible
+ m_pCurrentEdit = VclPtr::Create(pToolbar);
+ m_pCurrentEdit->SetWidthInChars(4);
+ m_pCurrentEdit->SetSizePixel(m_pCurrentEdit->GetOptimalSize());
+
+ m_pCurrentEdit->SetModifyHdl(LINK(this, MMCurrentEntryController, CurrentEditUpdatedHdl));
+ }
+
+ return uno::Reference(VCLUnoHelper::GetInterface(m_pCurrentEdit));
+}
+
+IMPL_LINK_TYPED(MMCurrentEntryController, CurrentEditUpdatedHdl, Edit&, rEdit, void)
+{
+ SwView* pView = ::GetActiveView();
+ SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem();
+
+ if (!pConfigItem)
+ return;
+
+ OUString aText(rEdit.GetText());
+ sal_Int32 nEntry = aText.toInt32();
+ if (!aText.isEmpty() && nEntry != pConfigItem->GetResultSetPosition())
+ {
+ pConfigItem->MoveResultSet(nEntry);
+ // notify about the change
+ dispatchCommand(".uno:MailMergeCurrentEntry", uno::Sequence());
+ }
+};
+
+void MMCurrentEntryController::statusChanged(const frame::FeatureStateEvent& rEvent) throw (uno::RuntimeException, std::exception)
+{
+ if (!m_pCurrentEdit)
+ return;
+
+ SwView* pView = ::GetActiveView();
+ SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem();
+
+ if (!pConfigItem || !rEvent.IsEnabled)
+ {
+ m_pCurrentEdit->Disable();
+ m_pCurrentEdit->SetText("");
+ }
+ else
+ {
+ sal_Int32 nEntry = m_pCurrentEdit->GetText().toInt32();
+ if (!m_pCurrentEdit->IsEnabled() || nEntry != pConfigItem->GetResultSetPosition())
+ {
+ m_pCurrentEdit->Enable();
+ m_pCurrentEdit->SetText(OUString::number(pConfigItem->GetResultSetPosition()));
+ }
+ }
+}
+
void MMExcludeEntryController::dispose() throw (uno::RuntimeException, std::exception)
{
SolarMutexGuard aSolarMutexGuard;
@@ -165,6 +305,14 @@ void MMExcludeEntryController::statusChanged(const frame::FeatureStateEvent& rEv
}
+extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface * SAL_CALL
+lo_writer_MMCurrentEntryController_get_implementation(
+ uno::XComponentContext *context,
+ uno::Sequence const &)
+{
+ return cppu::acquire(new MMCurrentEntryController(context));
+}
+
extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface * SAL_CALL
lo_writer_MMExcludeEntryController_get_implementation(
uno::XComponentContext *context,
diff --git a/sw/uiconfig/swform/toolbar/mailmerge.xml b/sw/uiconfig/swform/toolbar/mailmerge.xml
index 61cca367c0db..ff9773d5eab4 100644
--- a/sw/uiconfig/swform/toolbar/mailmerge.xml
+++ b/sw/uiconfig/swform/toolbar/mailmerge.xml
@@ -13,6 +13,7 @@
+
diff --git a/sw/uiconfig/swreport/toolbar/mailmerge.xml b/sw/uiconfig/swreport/toolbar/mailmerge.xml
index 61cca367c0db..ff9773d5eab4 100644
--- a/sw/uiconfig/swreport/toolbar/mailmerge.xml
+++ b/sw/uiconfig/swreport/toolbar/mailmerge.xml
@@ -13,6 +13,7 @@
+
diff --git a/sw/uiconfig/swriter/toolbar/mailmerge.xml b/sw/uiconfig/swriter/toolbar/mailmerge.xml
index 61cca367c0db..ff9773d5eab4 100644
--- a/sw/uiconfig/swriter/toolbar/mailmerge.xml
+++ b/sw/uiconfig/swriter/toolbar/mailmerge.xml
@@ -13,6 +13,7 @@
+
diff --git a/sw/uiconfig/swxform/toolbar/mailmerge.xml b/sw/uiconfig/swxform/toolbar/mailmerge.xml
index 61cca367c0db..ff9773d5eab4 100644
--- a/sw/uiconfig/swxform/toolbar/mailmerge.xml
+++ b/sw/uiconfig/swxform/toolbar/mailmerge.xml
@@ -13,6 +13,7 @@
+
diff --git a/sw/util/sw.component b/sw/util/sw.component
index ff6b032af603..c069d632ecbe 100644
--- a/sw/util/sw.component
+++ b/sw/util/sw.component
@@ -27,6 +27,10 @@
+
+
+