Kaydet (Commit) 16e248be authored tarafından Jan Holesovsky's avatar Jan Holesovsky Kaydeden (comit) Miklos Vajna

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
üst 1f1cff03
......@@ -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>
......
......@@ -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 \
))
......
......@@ -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 */
......
......@@ -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)
......
......@@ -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
()
[
......
......@@ -86,6 +86,11 @@ interface StarWriter
StateMethod = StateOther ;
]
FN_MAILMERGE_EXCLUDE_ENTRY
[
StateMethod = StateOther ;
]
FN_MAILMERGE_CREATE_DOCUMENTS
[
ExecMethod = ExecOther ;
......
......@@ -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
......
......@@ -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;
......
/* -*- 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: */
......@@ -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"/>
......
......@@ -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"/>
......
......@@ -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"/>
......
......@@ -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"/>
......
......@@ -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>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment