LibreOffice Module toolkit (master) 1
tabpagecontainer.cxx
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
24#include <helper/property.hxx>
25
26#include <com/sun/star/awt/XControlModel.hpp>
27#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
28#include <com/sun/star/uno/XComponentContext.hpp>
29
30#include <o3tl/safeint.hxx>
32#include <vcl/svapp.hxx>
33
35
36using namespace ::com::sun::star;
37using namespace ::com::sun::star::uno;
38using namespace ::com::sun::star::lang;
39using namespace ::com::sun::star::beans;
40using namespace ::com::sun::star::container;
41using namespace ::com::sun::star::view;
42using ::com::sun::star::awt::tab::XTabPageModel;
43
44constexpr OUStringLiteral WRONG_TYPE_EXCEPTION = u"Type must be css::awt::tab::XTabPageModel!";
45
46
47UnoControlTabPageContainerModel::UnoControlTabPageContainerModel( const Reference< XComponentContext >& i_factory )
49 ,maContainerListeners( *this )
50{
51 ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR );
52 ImplRegisterProperty( BASEPROPERTY_BORDER );
53 ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR );
54 ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL );
55 ImplRegisterProperty( BASEPROPERTY_ENABLED );
56 ImplRegisterProperty( BASEPROPERTY_HELPTEXT );
57 ImplRegisterProperty( BASEPROPERTY_HELPURL );
58 ImplRegisterProperty( BASEPROPERTY_PRINTABLE );
59 ImplRegisterProperty( BASEPROPERTY_TEXT );
60}
61
63{
64 return "com.sun.star.awt.tab.UnoControlTabPageContainerModel";
65}
66
68{
69 switch(nPropId)
70 {
72 return uno::Any( OUString("com.sun.star.awt.tab.UnoControlTabPageContainer") );
74 return uno::Any(sal_Int16(0)); // No Border
75 default:
77 }
78}
79
81{
82 static UnoPropertyArrayHelper aHelper( ImplGetPropertyIds() );
83 return aHelper;
84}
85Reference< css::beans::XPropertySetInfo > UnoControlTabPageContainerModel::getPropertySetInfo( )
86{
87 static Reference< css::beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
88 return xInfo;
89}
90
91namespace
92{
93 Reference< XTabPageModel > lcl_createTabPageModel( Reference<XComponentContext> const & i_context,
94 Sequence< Any > const & i_initArguments, Reference< XPropertySet > const & i_parentModel )
95 {
96 try
97 {
98 Reference< XPropertySetInfo > const xPSI( i_parentModel->getPropertySetInfo() );
99 bool const isGeometryControlModel = xPSI.is() && xPSI->hasPropertyByName("PositionX");
100
101 Reference< XInterface > xInstance;
102 if ( isGeometryControlModel )
103 xInstance = *( new OGeometryControlModel< UnoControlTabPageModel >( i_context ) );
104 else
105 xInstance = *( new UnoControlTabPageModel( i_context ) );
106
107 Reference< XTabPageModel > const xTabPageModel( xInstance, UNO_QUERY_THROW );
108 Reference< XInitialization > const xInit( xTabPageModel, UNO_QUERY_THROW );
109 xInit->initialize( i_initArguments );
110
111 return xTabPageModel;
112 }
113 catch( const RuntimeException& )
114 {
115 throw;
116 }
117 catch( const Exception& )
118 {
119 DBG_UNHANDLED_EXCEPTION("toolkit.controls");
120 }
121 return nullptr;
122 }
123}
124
125Reference< XTabPageModel > SAL_CALL UnoControlTabPageContainerModel::createTabPage( ::sal_Int16 i_tabPageID )
126{
127 Sequence< Any > aInitArgs{ Any(i_tabPageID) };
128 return lcl_createTabPageModel( m_xContext, aInitArgs, this );
129}
130
131Reference< XTabPageModel > SAL_CALL UnoControlTabPageContainerModel::loadTabPage( ::sal_Int16 i_tabPageID, const OUString& i_resourceURL )
132{
133 Sequence< Any > aInitArgs{ Any(i_tabPageID), Any(i_resourceURL) };
134 return lcl_createTabPageModel( m_xContext, aInitArgs, this );
135}
136
137void SAL_CALL UnoControlTabPageContainerModel::insertByIndex( ::sal_Int32 nIndex, const css::uno::Any& aElement)
138{
139 SolarMutexGuard aSolarGuard;
140 uno::Reference < XTabPageModel > xTabPageModel;
141 if(!(aElement >>= xTabPageModel))
142 throw IllegalArgumentException( WRONG_TYPE_EXCEPTION, static_cast<OWeakObject *>(this), 2 );
143
144 if ( sal_Int32( m_aTabPageVector.size()) ==nIndex )
145 m_aTabPageVector.push_back( xTabPageModel );
146 else if ( sal_Int32( m_aTabPageVector.size()) > nIndex )
147 {
148 std::vector< uno::Reference< XTabPageModel > >::iterator aIter = m_aTabPageVector.begin();
149 aIter += nIndex;
150 m_aTabPageVector.insert( aIter, xTabPageModel );
151 }
152 else
153 throw IndexOutOfBoundsException( OUString(), static_cast<OWeakObject *>(this) );
154 ContainerEvent aEvent;
155 aEvent.Source = *this;
156 aEvent.Element = aElement;
157 aEvent.Accessor <<= OUString::number(nIndex);
158 maContainerListeners.elementInserted( aEvent );
159
160}
161
162void SAL_CALL UnoControlTabPageContainerModel::removeByIndex( ::sal_Int32 /*Index*/ )
163{
164}
165// XIndexReplace
166void SAL_CALL UnoControlTabPageContainerModel::replaceByIndex( ::sal_Int32 /*Index*/, const uno::Any& /*Element*/ )
167{
168}
169
170// XIndexAccess
172{
173 std::unique_lock aGuard( m_aMutex );
174 return sal_Int32( m_aTabPageVector.size());
175}
176
178{
179 std::unique_lock aGuard( m_aMutex );
180 if ( nIndex < 0 || o3tl::make_unsigned(nIndex) > m_aTabPageVector.size() )
181 throw lang::IndexOutOfBoundsException();
183}
184
185// XElementAccess
187{
189}
190
192{
193 std::unique_lock aGuard( m_aMutex );
194 return !m_aTabPageVector.empty();
195}
196// XContainer
197void UnoControlTabPageContainerModel::addContainerListener( const Reference< XContainerListener >& l )
198{
199 maContainerListeners.addInterface( l );
200}
201
202void UnoControlTabPageContainerModel::removeContainerListener( const Reference< XContainerListener >& l )
203{
204 maContainerListeners.removeInterface( l );
205}
206
207
208
209UnoControlTabPageContainer::UnoControlTabPageContainer( const uno::Reference< uno::XComponentContext >& rxContext )
211 ,m_aTabPageListeners( *this )
212{
213}
214
216{
217 return "TabPageContainer";
218}
219
221{
222 lang::EventObject aEvt;
223 aEvt.Source = static_cast<cppu::OWeakObject*>(this);
224 m_aTabPageListeners.disposeAndClear( aEvt );
226}
227
228void UnoControlTabPageContainer::createPeer( const uno::Reference< awt::XToolkit > & rxToolkit, const uno::Reference< awt::XWindowPeer > & rParentPeer )
229{
230 UnoControlBase::createPeer( rxToolkit, rParentPeer );
231
232 Reference< XTabPageContainer > xTPContainer( getPeer(), UNO_QUERY_THROW );
233 if ( m_aTabPageListeners.getLength() )
234 xTPContainer->addTabPageContainerListener(&m_aTabPageListeners);
235}
236
237
238// XTabPageContainer
239
241{
242 SolarMutexGuard aSolarGuard;
243 Reference< XTabPageContainer > xTPContainer( getPeer(), UNO_QUERY_THROW );
244 return xTPContainer->getActiveTabPageID();
245}
246void SAL_CALL UnoControlTabPageContainer::setActiveTabPageID( ::sal_Int16 _activetabpageid )
247{
248 SolarMutexGuard aSolarGuard;
249 Reference< XTabPageContainer > xTPContainer( getPeer(), UNO_QUERY_THROW );
250 xTPContainer->setActiveTabPageID(_activetabpageid);
251}
253{
254 SolarMutexGuard aSolarGuard;
255 Reference< XTabPageContainer > xTPContainer( getPeer(), UNO_QUERY_THROW );
256 return xTPContainer->getTabPageCount();
257}
258sal_Bool SAL_CALL UnoControlTabPageContainer::isTabPageActive( ::sal_Int16 tabPageIndex )
259{
260 SolarMutexGuard aSolarGuard;
261 Reference< XTabPageContainer > xTPContainer( getPeer(), UNO_QUERY_THROW );
262 return xTPContainer->isTabPageActive(tabPageIndex);
263}
264Reference< css::awt::tab::XTabPage > SAL_CALL UnoControlTabPageContainer::getTabPage( ::sal_Int16 tabPageIndex )
265{
266 SolarMutexGuard aSolarGuard;
267 Reference< XTabPageContainer > xTPContainer( getPeer(), UNO_QUERY_THROW );
268 return xTPContainer->getTabPage(tabPageIndex);
269}
270Reference< css::awt::tab::XTabPage > SAL_CALL UnoControlTabPageContainer::getTabPageByID( ::sal_Int16 tabPageID )
271{
272 SolarMutexGuard aSolarGuard;
273 Reference< XTabPageContainer > xTPContainer( getPeer(), UNO_QUERY_THROW );
274 return xTPContainer->getTabPageByID(tabPageID);
275}
276void SAL_CALL UnoControlTabPageContainer::addTabPageContainerListener( const Reference< css::awt::tab::XTabPageContainerListener >& listener )
277{
278 m_aTabPageListeners.addInterface( listener );
279 if( getPeer().is() && m_aTabPageListeners.getLength() == 1 )
280 {
281 uno::Reference < awt::tab::XTabPageContainer > xTabPageContainer( getPeer(), uno::UNO_QUERY );
282 xTabPageContainer->addTabPageContainerListener( &m_aTabPageListeners );
283 }
284}
285void SAL_CALL UnoControlTabPageContainer::removeTabPageContainerListener( const Reference< css::awt::tab::XTabPageContainerListener >& listener )
286{
287 if( getPeer().is() && m_aTabPageListeners.getLength() == 1 )
288 {
289 uno::Reference < awt::tab::XTabPageContainer > xTabPageContainer( getPeer(), uno::UNO_QUERY );
290 xTabPageContainer->removeTabPageContainerListener( &m_aTabPageListeners );
291 }
292 m_aTabPageListeners.removeInterface( listener );
293}
294
295void UnoControlTabPageContainer::propertiesChange(const::css::uno::Sequence<PropertyChangeEvent> &aEvent)
296{
297 UnoControlTabPageContainer_Base::propertiesChange(aEvent);
298
299 SolarMutexGuard aSolarGuard;
300 Reference< XPropertiesChangeListener > xPropertiesChangeListener( getPeer(), UNO_QUERY_THROW );
301 return xPropertiesChangeListener->propertiesChange(aEvent);
302}
303
305{
306 UnoControlTabPageContainer_Base::updateFromModel();
307 if (!getPeer().is())
308 throw RuntimeException("No peer for tabpage container!");
309 Reference< XContainerListener > xContainerListener( getPeer(), UNO_QUERY );
310 ENSURE_OR_RETURN_VOID( xContainerListener.is(), "UnoListBoxControl::updateFromModel: a peer which is no ItemListListener?!" );
311
312 ContainerEvent aEvent;
313 aEvent.Source = getModel();
314 const Sequence< Reference< XControl > > aControls = getControls();
315
316 for ( const Reference< XControl >& rCtrl : aControls )
317 {
318 aEvent.Element <<= rCtrl;
319 xContainerListener->elementInserted( aEvent );
320 }
321}
322void SAL_CALL UnoControlTabPageContainer::addControl( const OUString& Name, const Reference< css::awt::XControl >& Control )
323{
324 SolarMutexGuard aSolarGuard;
325 ControlContainerBase::addControl(Name,Control);
326 if (!getPeer().is())
327 throw RuntimeException("No peer for tabpage container!");
328 Reference< XContainerListener > xContainerListener( getPeer(), UNO_QUERY );
329 ContainerEvent aEvent;
330 aEvent.Source = getModel();
331 aEvent.Element <<= Control;
332 xContainerListener->elementInserted( aEvent );
333}
334
335extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
337 css::uno::XComponentContext *context,
338 css::uno::Sequence<css::uno::Any> const &)
339{
340 return cppu::acquire(new UnoControlTabPageContainerModel(context));
341}
342
343extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
345 css::uno::XComponentContext *context,
346 css::uno::Sequence<css::uno::Any> const &)
347{
348 return cppu::acquire(new UnoControlTabPageContainer(context));
349}
350
351/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Reference< XComponentContext > m_xContext
AnyEventRef aEvent
virtual css::uno::Any ImplGetDefaultValue(sal_uInt16 nPropId) const
virtual void SAL_CALL insertByIndex(sal_Int32 Index, const css::uno::Any &Element) override
void SAL_CALL addContainerListener(const css::uno::Reference< css::container::XContainerListener > &xListener) override
virtual sal_Int32 SAL_CALL getCount() override
virtual css::uno::Reference< css::awt::tab::XTabPageModel > SAL_CALL createTabPage(::sal_Int16 TabPageID) override
virtual css::uno::Type SAL_CALL getElementType() override
UnoControlTabPageContainerModel(const css::uno::Reference< css::uno::XComponentContext > &i_factory)
virtual css::uno::Any SAL_CALL getByIndex(sal_Int32 Index) override
::cppu::IPropertyArrayHelper & getInfoHelper() override
virtual void SAL_CALL removeByIndex(sal_Int32 Index) override
virtual void SAL_CALL replaceByIndex(sal_Int32 Index, const css::uno::Any &Element) override
css::uno::Any ImplGetDefaultValue(sal_uInt16 nPropId) const override
std::vector< css::uno::Reference< css::awt::tab::XTabPageModel > > m_aTabPageVector
virtual css::uno::Reference< css::awt::tab::XTabPageModel > SAL_CALL loadTabPage(::sal_Int16 TabPageID, const OUString &ResourceURL) override
ContainerListenerMultiplexer maContainerListeners
virtual sal_Bool SAL_CALL hasElements() override
void SAL_CALL removeContainerListener(const css::uno::Reference< css::container::XContainerListener > &xListener) override
OUString SAL_CALL getServiceName() override
css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override
void SAL_CALL dispose() override
virtual void SAL_CALL propertiesChange(const ::css::uno::Sequence< ::css::beans::PropertyChangeEvent > &aEvent) override
OUString GetComponentServiceName() const override
virtual void SAL_CALL addTabPageContainerListener(const css::uno::Reference< css::awt::tab::XTabPageContainerListener > &listener) override
virtual void updateFromModel() override
UnoControlTabPageContainer(const css::uno::Reference< css::uno::XComponentContext > &rxContext)
TabPageListenerMultiplexer m_aTabPageListeners
virtual ::sal_Int16 SAL_CALL getActiveTabPageID() override
virtual void SAL_CALL addControl(const OUString &Name, const css::uno::Reference< css::awt::XControl > &Control) override
virtual ::sal_Int16 SAL_CALL getTabPageCount() override
virtual sal_Bool SAL_CALL isTabPageActive(::sal_Int16 tabPageIndex) override
virtual css::uno::Reference< css::awt::tab::XTabPage > SAL_CALL getTabPage(::sal_Int16 tabPageIndex) override
virtual void SAL_CALL removeTabPageContainerListener(const css::uno::Reference< css::awt::tab::XTabPageContainerListener > &listener) override
virtual css::uno::Reference< css::awt::tab::XTabPage > SAL_CALL getTabPageByID(::sal_Int16 tabPageID) override
void SAL_CALL createPeer(const css::uno::Reference< css::awt::XToolkit > &Toolkit, const css::uno::Reference< css::awt::XWindowPeer > &Parent) override
virtual void SAL_CALL setActiveTabPageID(::sal_Int16 _activetabpageid) override
void SAL_CALL dispose() override
Definition: unocontrol.cxx:346
void SAL_CALL createPeer(const css::uno::Reference< css::awt::XToolkit > &Toolkit, const css::uno::Reference< css::awt::XWindowPeer > &Parent) override
css::uno::Type const & get()
#define DBG_UNHANDLED_EXCEPTION(...)
#define ENSURE_OR_RETURN_VOID(c, m)
float u
Any aHelper
std::mutex m_aMutex
sal_Int32 nIndex
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
#define BASEPROPERTY_BORDER
Definition: property.hxx:39
#define BASEPROPERTY_TEXT
Definition: property.hxx:34
#define BASEPROPERTY_HELPURL
Definition: property.hxx:91
#define BASEPROPERTY_BACKGROUNDCOLOR
Definition: property.hxx:35
#define BASEPROPERTY_ENABLED
Definition: property.hxx:77
#define BASEPROPERTY_DEFAULTCONTROL
Definition: property.hxx:52
#define BASEPROPERTY_BORDERCOLOR
Definition: property.hxx:145
#define BASEPROPERTY_HELPTEXT
Definition: property.hxx:106
#define BASEPROPERTY_PRINTABLE
Definition: property.hxx:78
constexpr OUStringLiteral WRONG_TYPE_EXCEPTION
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * stardiv_Toolkit_UnoControlTabPageContainer_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * stardiv_Toolkit_UnoControlTabPageContainerModel_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
OUString Name
unsigned char sal_Bool