diff options
author | Jan Holesovsky <kendy@collabora.com> | 2015-12-30 00:00:37 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-03-18 09:13:56 +0100 |
commit | 16e248bec76f2c1587383d26581ecc8241c755f8 (patch) | |
tree | a468153e1583d66c46ca79ff5d1159737a9a76d0 | |
parent | 1f1cff03c4f15ee9fe7786a98ba8259a64823e0a (diff) |
mailmerge: Implement toolbar controller to exclude entries.
This can be used as a "How to implement a custom widget / control in
the toolbar" example:
* the Controller.xcu change introduces a .uno:MailMergeExcludeEntry command so
that it can be added in the toolbar .xml description (in this case
mailmerge.xml)
* the swriter.sdi introduces the .uno:MailMergeExcludeEntry command for the
sfx2 handling - so that it can get notifications about enable/disable
changes, invalidates, etc.
* wrtapp.sdi + associated apphdl.cxx change make it possible to forward
command invalidates (the rBindings.Invalidate(FN_MAILMERGE_EXCLUDE_ENTRY);)
to the MMExcludeEntryController::statusChanged() for further handling
(in this case setting the checked state according to the current data)
* MMExcludeEntryController::createItemWindow() implements the custom widget
itself (in this case a checkbox, but can be any VCL widget, even a custom
one)
* the rest (sw.component and the associated getImplementationName(),
supportsService(), etc.) takes care of the instantiation of the controller.
Change-Id: I68269538f779a6680b0ba98395b7985d3f1ab95a
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu | 11 | ||||
-rw-r--r-- | sw/Library_sw.mk | 1 | ||||
-rw-r--r-- | sw/inc/cmdid.h | 1 | ||||
-rw-r--r-- | sw/inc/dbui.hrc | 2 | ||||
-rw-r--r-- | sw/sdi/swriter.sdi | 17 | ||||
-rw-r--r-- | sw/sdi/wrtapp.sdi | 5 | ||||
-rw-r--r-- | sw/source/ui/dbui/mailmergewizard.src | 4 | ||||
-rw-r--r-- | sw/source/uibase/app/apphdl.cxx | 7 | ||||
-rw-r--r-- | sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx | 176 | ||||
-rw-r--r-- | sw/uiconfig/swform/toolbar/mailmerge.xml | 1 | ||||
-rw-r--r-- | sw/uiconfig/swreport/toolbar/mailmerge.xml | 1 | ||||
-rw-r--r-- | sw/uiconfig/swriter/toolbar/mailmerge.xml | 1 | ||||
-rw-r--r-- | sw/uiconfig/swxform/toolbar/mailmerge.xml | 1 | ||||
-rw-r--r-- | sw/util/sw.component | 4 |
14 files changed, 229 insertions, 3 deletions
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu index 6108449f7edf..f9c0f237aaa6 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 @@ <value>starshapes;.uno:StarShapes.star5</value> </prop> </node> + <node oor:name="lo.writer.MMExcludeEntryController" oor:op="replace"> + <prop oor:name="Command"> + <value>.uno:MailMergeExcludeEntry</value> + </prop> + <prop oor:name="Module"> + <value/> + </prop> + <prop oor:name="Controller"> + <value>lo.writer.MMExcludeEntryController</value> + </prop> + </node> <node oor:name="com.sun.star.svx.FindTextToolboxController" oor:op="replace"> <prop oor:name="Command"> <value>.uno:FindText</value> diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk index b405797d1b86..d912130b450c 100644 --- a/sw/Library_sw.mk +++ b/sw/Library_sw.mk @@ -767,6 +767,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\ sw/source/uibase/dbui/maildispatcher \ sw/source/uibase/dbui/mailmergechildwindow \ sw/source/uibase/dbui/mailmergehelper \ + sw/source/uibase/dbui/mailmergetoolbarcontrols \ sw/source/uibase/dbui/mmconfigitem \ sw/source/uibase/uno/unomailmerge \ )) diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h index 908d5c8e3893..0bb0cd469725 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_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/inc/dbui.hrc b/sw/inc/dbui.hrc index 8aeb2c7c509a..9bb616852b86 100644 --- a/sw/inc/dbui.hrc +++ b/sw/inc/dbui.hrc @@ -81,7 +81,7 @@ #define ST_LAYOUT (RC_DBUI_BEGIN + 56) #define ST_PREPAREMERGE (RC_DBUI_BEGIN + 57) #define ST_MERGE (RC_DBUI_BEGIN + 58) -#define ST_OUTPUT (RC_DBUI_BEGIN + 59) +#define ST_EXCLUDE (RC_DBUI_BEGIN + 59) #define ST_FINISH (RC_DBUI_BEGIN + 60) #define ST_ADDRESSLIST (RC_DBUI_BEGIN + 61) diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi index 5383bca65f77..7bc5b86c5948 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 MailMergeExcludeEntry FN_MAILMERGE_EXCLUDE_ENTRY +() +[ + AutoUpdate = TRUE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = TRUE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = GID_DOCUMENT; +] + SfxVoidItem MailMergeCreateDocuments FN_MAILMERGE_CREATE_DOCUMENTS () [ diff --git a/sw/sdi/wrtapp.sdi b/sw/sdi/wrtapp.sdi index d1e71c4694d0..6ead72816f89 100644 --- a/sw/sdi/wrtapp.sdi +++ b/sw/sdi/wrtapp.sdi @@ -86,6 +86,11 @@ interface StarWriter StateMethod = StateOther ; ] + FN_MAILMERGE_EXCLUDE_ENTRY + [ + StateMethod = StateOther ; + ] + FN_MAILMERGE_CREATE_DOCUMENTS [ ExecMethod = ExecOther ; diff --git a/sw/source/ui/dbui/mailmergewizard.src b/sw/source/ui/dbui/mailmergewizard.src index 7231ce2b00fa..176af6724265 100644 --- a/sw/source/ui/dbui/mailmergewizard.src +++ b/sw/source/ui/dbui/mailmergewizard.src @@ -59,9 +59,9 @@ String ST_MERGE Text [ en-US ] = "Personalize document"; }; -String ST_OUTPUT +String ST_EXCLUDE { - Text [ en-US ] = "Save, print or send"; + Text [ en-US ] = "Exclude recipient"; }; String ST_FINISH diff --git a/sw/source/uibase/app/apphdl.cxx b/sw/source/uibase/app/apphdl.cxx index 4e2987f3e38d..575ddc319bd0 100644 --- a/sw/source/uibase/app/apphdl.cxx +++ b/sw/source/uibase/app/apphdl.cxx @@ -225,6 +225,12 @@ void SwModule::StateOther(SfxItemSet &rSet) } } break; + case FN_MAILMERGE_EXCLUDE_ENTRY: + { + // just trigger calling statusChanged() of MMExcludeEntryController + rSet.InvalidateItem(nWhich); + } + break; case FN_MAILMERGE_CREATE_DOCUMENTS: case FN_MAILMERGE_SAVE_DOCUMENTS: case FN_MAILMERGE_PRINT_DOCUMENTS: @@ -784,6 +790,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_EXCLUDE_ENTRY); rBindings.Update(); } break; diff --git a/sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx b/sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx new file mode 100644 index 000000000000..d4dacfb32f10 --- /dev/null +++ b/sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx @@ -0,0 +1,176 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <cppuhelper/queryinterface.hxx> +#include <cppuhelper/supportsservice.hxx> +#include <svtools/toolboxcontroller.hxx> +#include <toolkit/helper/vclunohelper.hxx> +#include <vcl/button.hxx> +#include <vcl/svapp.hxx> +#include <vcl/toolbox.hxx> + +#include <com/sun/star/lang/XServiceInfo.hpp> + +#include <dbui.hrc> +#include <mmconfigitem.hxx> +#include <swmodule.hxx> +#include <view.hxx> + +using namespace css; + +namespace { + +/// Controller for .uno:MailMergeExcludeEntry toolbar checkbox: creates the checkbox & handles the value. +class MMExcludeEntryController : public svt::ToolboxController, public lang::XServiceInfo +{ + VclPtr<CheckBox> m_pExcludeCheckbox; + + DECL_LINK_TYPED(ExcludeHdl, CheckBox&, void); + +public: + MMExcludeEntryController(const uno::Reference<uno::XComponentContext>& rContext) + : svt::ToolboxController(rContext, uno::Reference<frame::XFrame>(), OUString(".uno:MailMergeExcludeEntry")) + , m_pExcludeCheckbox(nullptr) + { + } + + virtual ~MMExcludeEntryController() + { + } + + // 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<lang::XServiceInfo*>(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.MMExcludeEntryController"); + } + + virtual sal_Bool SAL_CALL supportsService(const OUString& rServiceName) throw (uno::RuntimeException, std::exception) override + { + return cppu::supportsService(this, rServiceName); + } + + virtual uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() throw (uno::RuntimeException, std::exception) override + { + uno::Sequence<OUString> 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<awt::XWindow> SAL_CALL createItemWindow(const uno::Reference<awt::XWindow>& rParent) throw (uno::RuntimeException, std::exception) override; + + // XStatusListener + virtual void SAL_CALL statusChanged(const frame::FeatureStateEvent& rEvent) throw (uno::RuntimeException, std::exception) override; +}; + +void MMExcludeEntryController::dispose() throw (uno::RuntimeException, std::exception) +{ + SolarMutexGuard aSolarMutexGuard; + + svt::ToolboxController::dispose(); + m_pExcludeCheckbox.disposeAndClear(); +} + +void MMExcludeEntryController::initialize(const uno::Sequence< uno::Any >& aArguments) throw (uno::Exception, uno::RuntimeException, std::exception) +{ + svt::ToolboxController::initialize(aArguments); +} + +uno::Reference<awt::XWindow> MMExcludeEntryController::createItemWindow(const uno::Reference<awt::XWindow>& rParent) throw (uno::RuntimeException, std::exception) +{ + vcl::Window* pParent = VCLUnoHelper::GetWindow(rParent); + ToolBox* pToolbar = dynamic_cast<ToolBox*>(pParent); + if (pToolbar) + { + // make it visible + m_pExcludeCheckbox = VclPtr<CheckBox>::Create(pToolbar); + m_pExcludeCheckbox->SetText(SW_RES(ST_EXCLUDE)); + m_pExcludeCheckbox->SetSizePixel(m_pExcludeCheckbox->GetOptimalSize()); + + m_pExcludeCheckbox->SetToggleHdl(LINK(this, MMExcludeEntryController, ExcludeHdl)); + } + + return uno::Reference<awt::XWindow>(VCLUnoHelper::GetInterface(m_pExcludeCheckbox)); +} + +IMPL_LINK_TYPED(MMExcludeEntryController, ExcludeHdl, CheckBox&, rCheckbox, void) +{ + SwView* pView = ::GetActiveView(); + SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); + + if (pConfigItem) + pConfigItem->ExcludeRecord(pConfigItem->GetResultSetPosition(), rCheckbox.IsChecked()); +}; + +void MMExcludeEntryController::statusChanged(const frame::FeatureStateEvent& rEvent) throw (uno::RuntimeException, std::exception) +{ + if (!m_pExcludeCheckbox) + return; + + SwView* pView = ::GetActiveView(); + SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); + + if (!pConfigItem || !rEvent.IsEnabled) + { + m_pExcludeCheckbox->Disable(); + m_pExcludeCheckbox->Check(false); + } + else + { + m_pExcludeCheckbox->Enable(); + m_pExcludeCheckbox->Check(pConfigItem->IsRecordExcluded(pConfigItem->GetResultSetPosition())); + } +} + +} + +extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface * SAL_CALL +lo_writer_MMExcludeEntryController_get_implementation( + uno::XComponentContext *context, + uno::Sequence<uno::Any> const &) +{ + return cppu::acquire(new MMExcludeEntryController(context)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/uiconfig/swform/toolbar/mailmerge.xml b/sw/uiconfig/swform/toolbar/mailmerge.xml index 7610f2aef49a..61cca367c0db 100644 --- a/sw/uiconfig/swform/toolbar/mailmerge.xml +++ b/sw/uiconfig/swform/toolbar/mailmerge.xml @@ -15,6 +15,7 @@ <toolbar:toolbaritem xlink:href=".uno:MailMergePrevEntry"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeNextEntry"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeLastEntry"/> + <toolbar:toolbaritem xlink:href=".uno:MailMergeExcludeEntry"/> <toolbar:toolbarseparator/> <toolbar:toolbaritem xlink:href=".uno:MailMergeCreateDocuments"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeSaveDocuments"/> diff --git a/sw/uiconfig/swreport/toolbar/mailmerge.xml b/sw/uiconfig/swreport/toolbar/mailmerge.xml index 7610f2aef49a..61cca367c0db 100644 --- a/sw/uiconfig/swreport/toolbar/mailmerge.xml +++ b/sw/uiconfig/swreport/toolbar/mailmerge.xml @@ -15,6 +15,7 @@ <toolbar:toolbaritem xlink:href=".uno:MailMergePrevEntry"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeNextEntry"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeLastEntry"/> + <toolbar:toolbaritem xlink:href=".uno:MailMergeExcludeEntry"/> <toolbar:toolbarseparator/> <toolbar:toolbaritem xlink:href=".uno:MailMergeCreateDocuments"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeSaveDocuments"/> diff --git a/sw/uiconfig/swriter/toolbar/mailmerge.xml b/sw/uiconfig/swriter/toolbar/mailmerge.xml index 7610f2aef49a..61cca367c0db 100644 --- a/sw/uiconfig/swriter/toolbar/mailmerge.xml +++ b/sw/uiconfig/swriter/toolbar/mailmerge.xml @@ -15,6 +15,7 @@ <toolbar:toolbaritem xlink:href=".uno:MailMergePrevEntry"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeNextEntry"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeLastEntry"/> + <toolbar:toolbaritem xlink:href=".uno:MailMergeExcludeEntry"/> <toolbar:toolbarseparator/> <toolbar:toolbaritem xlink:href=".uno:MailMergeCreateDocuments"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeSaveDocuments"/> diff --git a/sw/uiconfig/swxform/toolbar/mailmerge.xml b/sw/uiconfig/swxform/toolbar/mailmerge.xml index 7610f2aef49a..61cca367c0db 100644 --- a/sw/uiconfig/swxform/toolbar/mailmerge.xml +++ b/sw/uiconfig/swxform/toolbar/mailmerge.xml @@ -15,6 +15,7 @@ <toolbar:toolbaritem xlink:href=".uno:MailMergePrevEntry"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeNextEntry"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeLastEntry"/> + <toolbar:toolbaritem xlink:href=".uno:MailMergeExcludeEntry"/> <toolbar:toolbarseparator/> <toolbar:toolbaritem xlink:href=".uno:MailMergeCreateDocuments"/> <toolbar:toolbaritem xlink:href=".uno:MailMergeSaveDocuments"/> diff --git a/sw/util/sw.component b/sw/util/sw.component index 010f41bffb4e..ff6b032af603 100644 --- a/sw/util/sw.component +++ b/sw/util/sw.component @@ -27,6 +27,10 @@ <service name="com.sun.star.sdb.DataAccessDescriptor"/> <service name="com.sun.star.text.MailMerge"/> </implementation> + <implementation name="lo.writer.MMExcludeEntryController" + constructor="lo_writer_MMExcludeEntryController_get_implementation"> + <service name="com.sun.star.frame.ToolbarController"/> + </implementation> <implementation name="SwXModule" constructor="SwXModule_get_implementation"> <service name="com.sun.star.text.GlobalSettings"/> </implementation> |