LibreOffice Module toolkit (master) 1
controlmodelcontainerbase.hxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#pragma once
21
22#include <com/sun/star/container/XNameContainer.hpp>
23#include <com/sun/star/container/XContainer.hpp>
24#include <com/sun/star/lang/XMultiServiceFactory.hpp>
25#include <com/sun/star/awt/XTabControllerModel.hpp>
26#include <com/sun/star/util/XChangesNotifier.hpp>
27#include <com/sun/star/util/XChangesListener.hpp>
28#include <com/sun/star/util/XModifyListener.hpp>
29#include <com/sun/star/beans/XPropertyChangeListener.hpp>
32#include <cppuhelper/weak.hxx>
37#include <com/sun/star/awt/tab/XTabPageModel.hpp>
38#include <com/sun/star/lang/XInitialization.hpp>
40#include <mutex>
41#include <vector>
42
43namespace com::sun::star::resource { class XStringResourceResolver; }
44namespace com::sun::star::uno { class XComponentContext; }
45
46
49 , css::lang::XMultiServiceFactory
50 , css::container::XContainer
51 , css::container::XNameContainer
52 , css::awt::XTabControllerModel
53 , css::util::XChangesNotifier
54 , css::beans::XPropertyChangeListener
55 , css::awt::tab::XTabPageModel
56 , css::lang::XInitialization
58
60{
61public:
63 // would like to make this typedef private, too, but the Forte 7 compiler does have
64 // problems with this...
65 typedef ::std::pair< css::uno::Reference< css::awt::XControlModel >, OUString >
67private:
68 typedef ::std::vector< UnoControlModelHolder > UnoControlModelHolderVector;
69
70public:
71 // for grouping control models (XTabControllerModel::getGroupXXX)
72 typedef ::std::vector< css::uno::Reference< css::awt::XControlModel > >
74 typedef ::std::vector< ModelGroup > AllGroups;
75
76 friend struct CloneControlModel;
77 friend struct CompareControlModel;
78
79protected:
80 ContainerListenerMultiplexer maContainerListeners;
83
86
87 OUString m_sImageURL;
88 OUString m_sTooltip;
89 sal_Int16 m_nTabPageId;
90
91 void Clone_Impl(ControlModelContainerBase& _rClone) const;
92protected:
93 css::uno::Any ImplGetDefaultValue( sal_uInt16 nPropId ) const override;
95
96 UnoControlModelHolderVector::iterator ImplFindElement( std::u16string_view rName );
97
102 void updateUserFormChildren( const css::uno::Reference< css::container::XNameContainer >& xAllChildren, const OUString& aName, ChildOperation Operation, const css::uno::Reference< css::awt::XControlModel >& xTarget );
103public:
104 ControlModelContainerBase( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
106 virtual ~ControlModelContainerBase() override;
107
108 rtl::Reference<UnoControlModel> Clone() const override;
109
110 // css::container::XContainer
111 void SAL_CALL addContainerListener( const css::uno::Reference< css::container::XContainerListener >& xListener ) override;
112 void SAL_CALL removeContainerListener( const css::uno::Reference< css::container::XContainerListener >& xListener ) override;
113
114 // css::container::XElementAccess
115 css::uno::Type SAL_CALL getElementType( ) override;
116 sal_Bool SAL_CALL hasElements( ) override;
117
118 // css::container::XNameContainer, XNameReplace, XNameAccess
119 void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override;
120 css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
121 css::uno::Sequence< OUString > SAL_CALL getElementNames( ) override;
122 sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
123 void SAL_CALL insertByName( const OUString& aName, const css::uno::Any& aElement ) override;
124 void SAL_CALL removeByName( const OUString& Name ) override;
125
126 // css::beans::XMultiPropertySet
127 css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
128
129 // css::lang::XMultiServiceFactory
130 css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( const OUString& aServiceSpecifier ) override;
131 css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments( const OUString& ServiceSpecifier, const css::uno::Sequence< css::uno::Any >& Arguments ) override;
132 css::uno::Sequence< OUString > SAL_CALL getAvailableServiceNames( ) override;
133
134 // XComponent
135 void SAL_CALL dispose( ) override;
136
137 // XTabControllerModel
138 virtual sal_Bool SAL_CALL getGroupControl( ) override;
139 virtual void SAL_CALL setGroupControl( sal_Bool GroupControl ) override;
140 virtual void SAL_CALL setControlModels( const css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > >& Controls ) override;
141 virtual css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > > SAL_CALL getControlModels( ) override;
142 virtual void SAL_CALL setGroup( const css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > >& Group, const OUString& GroupName ) override;
143 virtual sal_Int32 SAL_CALL getGroupCount( ) override;
144 virtual void SAL_CALL getGroup( sal_Int32 nGroup, css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > >& Group, OUString& Name ) override;
145 virtual void SAL_CALL getGroupByName( const OUString& Name, css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > >& Group ) override;
146
147 // XChangesNotifier
148 virtual void SAL_CALL addChangesListener( const css::uno::Reference< css::util::XChangesListener >& aListener ) override;
149 virtual void SAL_CALL removeChangesListener( const css::uno::Reference< css::util::XChangesListener >& aListener ) override;
150
151 // XPropertyChangeListener
152 virtual void SAL_CALL propertyChange( const css::beans::PropertyChangeEvent& evt ) override;
153
154 // XEventListener
156 virtual void SAL_CALL disposing( const css::lang::EventObject& evt ) override;
157
158 // XServiceInfo
159 DECLIMPL_SERVICEINFO_DERIVED(ControlModelContainerBase, ControlModel_Base, "toolkit.ControlModelContainerBase" )
160
161 // XInitialization
162 virtual void SAL_CALL initialize (const css::uno::Sequence<css::uno::Any>& rArguments) override;
163
164 // css::awt::tab::XTabPageModel
165 virtual ::sal_Int16 SAL_CALL getTabPageID() override;
166 virtual sal_Bool SAL_CALL getEnabled() override;
167 virtual void SAL_CALL setEnabled( sal_Bool _enabled ) override;
168 virtual OUString SAL_CALL getTitle() override;
169 virtual void SAL_CALL setTitle( const OUString& _title ) override;
170 virtual OUString SAL_CALL getImageURL() override;
171 virtual void SAL_CALL setImageURL( const OUString& _imageurl ) override;
172 virtual OUString SAL_CALL getToolTip() override;
173 virtual void SAL_CALL setToolTip( const OUString& _tooltip ) override;
174
175protected:
176 void startControlListening( const css::uno::Reference< css::awt::XControlModel >& _rxChildModel );
177 void stopControlListening( const css::uno::Reference< css::awt::XControlModel >& _rxChildModel );
178
179 void implNotifyTabModelChange( const OUString& _rAccessor );
180
182};
183
184class ResourceListener final : public css::util::XModifyListener,
185 public ::cppu::OWeakObject
186{
187 public:
188 ResourceListener( const css::uno::Reference< css::util::XModifyListener >& xListener );
189 virtual ~ResourceListener() override;
190
191 void startListening( const css::uno::Reference< css::resource::XStringResourceResolver >& rResource );
192 void stopListening();
193
194 // XInterface
195 virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override;
196 virtual void SAL_CALL acquire() noexcept override;
197 virtual void SAL_CALL release() noexcept override;
198
199 // XModifyListener
200 virtual void SAL_CALL modified( const css::lang::EventObject& aEvent ) override;
201
202 // XEventListener
203 virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
204
205 private:
206 std::mutex m_aMutex;
207 css::uno::Reference< css::resource::XStringResourceResolver > m_xResource;
208 css::uno::Reference< css::util::XModifyListener > m_xListener;
210};
211
213 , css::container::XContainerListener
214 , css::util::XChangesListener
215 , css::util::XModifyListener
217
219{
220protected:
221 css::uno::Reference< css::uno::XComponentContext > m_xContext;
224 css::uno::Reference< css::awt::XTabController > mxTabController;
225 css::uno::Reference< css::util::XModifyListener > mxListener;
226
227 void ImplInsertControl( css::uno::Reference< css::awt::XControlModel > const & rxModel, const OUString& rName );
228 void ImplRemoveControl( css::uno::Reference< css::awt::XControlModel > const & rxModel );
229 virtual void ImplSetPosSize( css::uno::Reference< css::awt::XControl >& rxCtrl );
230 void ImplUpdateResourceResolver();
231 void ImplStartListingForResourceEvents();
232
233#ifdef _MSC_VER
234 // just implemented to let the various FooImplInheritanceHelper compile
236#endif
237
238public:
239 ControlContainerBase( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
240 virtual ~ControlContainerBase() override;
241
242 DECLIMPL_SERVICEINFO_DERIVED( ControlContainerBase, UnoControlBase, "toolkit.ControlContainerBase" )
243
244 void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
245 void SAL_CALL dispose() override;
246
247 void SAL_CALL createPeer( const css::uno::Reference< css::awt::XToolkit >& Toolkit, const css::uno::Reference< css::awt::XWindowPeer >& Parent ) override;
248
249 // css::container::XContainerListener
250 void SAL_CALL elementInserted( const css::container::ContainerEvent& Event ) override;
251 void SAL_CALL elementRemoved( const css::container::ContainerEvent& Event ) override;
252 void SAL_CALL elementReplaced( const css::container::ContainerEvent& Event ) override;
253
254 // XChangesListener
255 virtual void SAL_CALL changesOccurred( const css::util::ChangesEvent& Event ) override;
256
257 // css::awt::XControl
258 sal_Bool SAL_CALL setModel( const css::uno::Reference< css::awt::XControlModel >& Model ) override;
259 void SAL_CALL setDesignMode( sal_Bool bOn ) override;
260 // XModifyListener
261 // Using a dummy/no-op implementation here, not sure if every container control needs
262 // to implement this, certainly Dialog does, lets see about others
263 virtual void SAL_CALL modified( const css::lang::EventObject& ) override {}
264protected:
265 virtual void ImplModelPropertiesChanged( const css::uno::Sequence< css::beans::PropertyChangeEvent >& rEvents ) override;
266 virtual void removingControl( const css::uno::Reference< css::awt::XControl >& _rxControl ) override;
267 virtual void addingControl( const css::uno::Reference< css::awt::XControl >& _rxControl ) override;
268};
269
270/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
struct _ADOGroup Group
AnyEventRef aEvent
css::uno::Reference< css::awt::XTabController > mxTabController
css::uno::Reference< css::util::XModifyListener > mxListener
css::uno::Reference< css::uno::XComponentContext > m_xContext
virtual void SAL_CALL addChangesListener(const css::uno::Reference< css::util::XChangesListener > &aListener) override
UnoControlModelHolderVector maModels
sal_Bool SAL_CALL hasByName(const OUString &aName) override
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &rArguments) override
css::uno::Any SAL_CALL getByName(const OUString &aName) override
css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override
virtual void SAL_CALL setToolTip(const OUString &_tooltip) override
virtual OUString SAL_CALL getTitle() override
ContainerListenerMultiplexer maContainerListeners
virtual void SAL_CALL setControlModels(const css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > > &Controls) override
virtual void SAL_CALL setGroupControl(sal_Bool GroupControl) override
::std::vector< css::uno::Reference< css::awt::XControlModel > > ModelGroup
void updateUserFormChildren(const css::uno::Reference< css::container::XNameContainer > &xAllChildren, const OUString &aName, ChildOperation Operation, const css::uno::Reference< css::awt::XControlModel > &xTarget)
sal_Bool SAL_CALL hasElements() override
virtual sal_Bool SAL_CALL getEnabled() override
void SAL_CALL replaceByName(const OUString &aName, const css::uno::Any &aElement) override
void SAL_CALL insertByName(const OUString &aName, const css::uno::Any &aElement) override
void stopControlListening(const css::uno::Reference< css::awt::XControlModel > &_rxChildModel)
virtual void SAL_CALL getGroup(sal_Int32 nGroup, css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > > &Group, OUString &Name) override
void Clone_Impl(ControlModelContainerBase &_rClone) const
void implNotifyTabModelChange(const OUString &_rAccessor)
void SAL_CALL addContainerListener(const css::uno::Reference< css::container::XContainerListener > &xListener) override
::cppu::IPropertyArrayHelper & getInfoHelper() override
void SAL_CALL removeByName(const OUString &Name) override
virtual sal_Int32 SAL_CALL getGroupCount() override
css::uno::Sequence< OUString > SAL_CALL getAvailableServiceNames() override
virtual OUString SAL_CALL getToolTip() override
virtual void SAL_CALL setEnabled(sal_Bool _enabled) override
virtual void SAL_CALL removeChangesListener(const css::uno::Reference< css::util::XChangesListener > &aListener) override
css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments(const OUString &ServiceSpecifier, const css::uno::Sequence< css::uno::Any > &Arguments) override
virtual void SAL_CALL setGroup(const css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > > &Group, const OUString &GroupName) override
virtual void SAL_CALL propertyChange(const css::beans::PropertyChangeEvent &evt) override
::comphelper::OInterfaceContainerHelper4< css::util::XChangesListener > maChangeListeners
css::uno::Sequence< OUString > SAL_CALL getElementNames() override
virtual css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > > SAL_CALL getControlModels() override
::std::vector< ModelGroup > AllGroups
css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance(const OUString &aServiceSpecifier) override
virtual void SAL_CALL getGroupByName(const OUString &Name, css::uno::Sequence< css::uno::Reference< css::awt::XControlModel > > &Group) override
virtual void SAL_CALL disposing(const css::lang::EventObject &evt) override
virtual void SAL_CALL setTitle(const OUString &_title) override
css::uno::Type SAL_CALL getElementType() override
css::uno::Any ImplGetDefaultValue(sal_uInt16 nPropId) const override
virtual void SAL_CALL setImageURL(const OUString &_imageurl) override
void SAL_CALL removeContainerListener(const css::uno::Reference< css::container::XContainerListener > &xListener) override
::std::pair< css::uno::Reference< css::awt::XControlModel >, OUString > UnoControlModelHolder
virtual ::sal_Int16 SAL_CALL getTabPageID() override
rtl::Reference< UnoControlModel > Clone() const override
virtual OUString SAL_CALL getImageURL() override
::std::vector< UnoControlModelHolder > UnoControlModelHolderVector
void startControlListening(const css::uno::Reference< css::awt::XControlModel > &_rxChildModel)
ControlModelContainerBase(const css::uno::Reference< css::uno::XComponentContext > &rxContext)
virtual sal_Bool SAL_CALL getGroupControl() override
UnoControlModelHolderVector::iterator ImplFindElement(std::u16string_view rName)
css::uno::Reference< css::util::XModifyListener > m_xListener
css::uno::Reference< css::resource::XStringResourceResolver > m_xResource
void disposing(std::unique_lock< std::mutex > &rGuard)
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const &rType) SAL_OVERRIDE
virtual void SAL_CALL release() SAL_NOEXCEPT SAL_OVERRIDE
virtual void SAL_CALL acquire() SAL_NOEXCEPT SAL_OVERRIDE
UnoControlModel ControlModel_Base
::cppu::AggImplInheritanceHelper3< UnoControlContainer, css::container::XContainerListener, css::util::XChangesListener, css::util::XModifyListener > ControlContainer_IBase
::cppu::AggImplInheritanceHelper8< ControlModel_Base, css::lang::XMultiServiceFactory, css::container::XContainer, css::container::XNameContainer, css::awt::XTabControllerModel, css::util::XChangesNotifier, css::beans::XPropertyChangeListener, css::awt::tab::XTabPageModel, css::lang::XInitialization > ControlModelContainer_IBase
void SAL_CALL elementReplaced(const css::container::ContainerEvent &Event) override
void SAL_CALL elementRemoved(const css::container::ContainerEvent &Event) override
DECL_LISTENERMULTIPLEXER_END void SAL_CALL elementInserted(const css::container::ContainerEvent &Event) override
#define DECLIMPL_SERVICEINFO_DERIVED(ImplName, BaseClass, ServiceName)
Definition: macros.hxx:154
unsigned char sal_Bool