1*b0724fc6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b0724fc6SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b0724fc6SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b0724fc6SAndrew Rist  * distributed with this work for additional information
6*b0724fc6SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b0724fc6SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b0724fc6SAndrew Rist  * "License"); you may not use this file except in compliance
9*b0724fc6SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*b0724fc6SAndrew Rist  *
11*b0724fc6SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*b0724fc6SAndrew Rist  *
13*b0724fc6SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b0724fc6SAndrew Rist  * software distributed under the License is distributed on an
15*b0724fc6SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b0724fc6SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b0724fc6SAndrew Rist  * specific language governing permissions and limitations
18*b0724fc6SAndrew Rist  * under the License.
19*b0724fc6SAndrew Rist  *
20*b0724fc6SAndrew Rist  *************************************************************/
21*b0724fc6SAndrew Rist 
22*b0724fc6SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_toolkit.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <toolkit/awt/vclxcontainer.hxx>
29cdf0e10cSrcweir #include <toolkit/helper/macros.hxx>
30cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
31cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
32cdf0e10cSrcweir #include <rtl/memory.h>
33cdf0e10cSrcweir #include <rtl/uuid.h>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <vcl/window.hxx>
36cdf0e10cSrcweir #include <tools/debug.hxx>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir //	----------------------------------------------------
39cdf0e10cSrcweir //	class VCLXContainer
40cdf0e10cSrcweir //	----------------------------------------------------
41cdf0e10cSrcweir 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)42cdf0e10cSrcweir void VCLXContainer::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
43cdf0e10cSrcweir {
44cdf0e10cSrcweir     VCLXWindow::ImplGetPropertyIds( rIds );
45cdf0e10cSrcweir }
46cdf0e10cSrcweir 
VCLXContainer()47cdf0e10cSrcweir VCLXContainer::VCLXContainer()
48cdf0e10cSrcweir {
49cdf0e10cSrcweir }
50cdf0e10cSrcweir 
~VCLXContainer()51cdf0e10cSrcweir VCLXContainer::~VCLXContainer()
52cdf0e10cSrcweir {
53cdf0e10cSrcweir }
54cdf0e10cSrcweir 
55cdf0e10cSrcweir // ::com::sun::star::uno::XInterface
queryInterface(const::com::sun::star::uno::Type & rType)56cdf0e10cSrcweir ::com::sun::star::uno::Any VCLXContainer::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
57cdf0e10cSrcweir {
58cdf0e10cSrcweir 	::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
59cdf0e10cSrcweir 										SAL_STATIC_CAST( ::com::sun::star::awt::XVclContainer*, this ),
60cdf0e10cSrcweir 										SAL_STATIC_CAST( ::com::sun::star::awt::XVclContainerPeer*, this ) );
61cdf0e10cSrcweir 	return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
62cdf0e10cSrcweir }
63cdf0e10cSrcweir 
64cdf0e10cSrcweir // ::com::sun::star::lang::XTypeProvider
65cdf0e10cSrcweir IMPL_XTYPEPROVIDER_START( VCLXContainer )
66cdf0e10cSrcweir 	getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XVclContainer>* ) NULL ),
67cdf0e10cSrcweir 	getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XVclContainerPeer>* ) NULL ),
68cdf0e10cSrcweir 	VCLXWindow::getTypes()
69cdf0e10cSrcweir IMPL_XTYPEPROVIDER_END
70cdf0e10cSrcweir 
71cdf0e10cSrcweir 
72cdf0e10cSrcweir // ::com::sun::star::awt::XVclContainer
73cdf0e10cSrcweir void VCLXContainer::addVclContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XVclContainerListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException)
74cdf0e10cSrcweir {
75cdf0e10cSrcweir 	::vos::OGuard aGuard( GetMutex() );
76cdf0e10cSrcweir 
77cdf0e10cSrcweir 	GetContainerListeners().addInterface( rxListener );
78cdf0e10cSrcweir }
79cdf0e10cSrcweir 
removeVclContainerListener(const::com::sun::star::uno::Reference<::com::sun::star::awt::XVclContainerListener> & rxListener)80cdf0e10cSrcweir void VCLXContainer::removeVclContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XVclContainerListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException)
81cdf0e10cSrcweir {
82cdf0e10cSrcweir 	::vos::OGuard aGuard( GetMutex() );
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 	GetContainerListeners().removeInterface( rxListener );
85cdf0e10cSrcweir }
86cdf0e10cSrcweir 
getWindows()87cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > > VCLXContainer::getWindows(  ) throw(::com::sun::star::uno::RuntimeException)
88cdf0e10cSrcweir {
89cdf0e10cSrcweir 	::vos::OGuard aGuard( GetMutex() );
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 	// Bei allen Childs das Container-Interface abfragen...
92cdf0e10cSrcweir 	::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > > aSeq;
93cdf0e10cSrcweir 	Window* pWindow = GetWindow();
94cdf0e10cSrcweir 	if ( pWindow )
95cdf0e10cSrcweir 	{
96cdf0e10cSrcweir 		sal_uInt16 nChilds = pWindow->GetChildCount();
97cdf0e10cSrcweir 		if ( nChilds )
98cdf0e10cSrcweir 		{
99cdf0e10cSrcweir 			aSeq = ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > >( nChilds );
100cdf0e10cSrcweir 			::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > * pChildRefs = aSeq.getArray();
101cdf0e10cSrcweir 			for ( sal_uInt16 n = 0; n < nChilds; n++ )
102cdf0e10cSrcweir 			{
103cdf0e10cSrcweir 				Window* pChild = pWindow->GetChild( n );
104cdf0e10cSrcweir 				::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >  xWP = pChild->GetComponentInterface( sal_True );
105cdf0e10cSrcweir 				::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xW( xWP, ::com::sun::star::uno::UNO_QUERY );
106cdf0e10cSrcweir 				pChildRefs[n] = xW;
107cdf0e10cSrcweir 			}
108cdf0e10cSrcweir 		}
109cdf0e10cSrcweir 	}
110cdf0e10cSrcweir 	return aSeq;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 
114cdf0e10cSrcweir // ::com::sun::star::awt::XVclContainerPeer
enableDialogControl(sal_Bool bEnable)115cdf0e10cSrcweir void VCLXContainer::enableDialogControl( sal_Bool bEnable ) throw(::com::sun::star::uno::RuntimeException)
116cdf0e10cSrcweir {
117cdf0e10cSrcweir 	::vos::OGuard aGuard( GetMutex() );
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	Window* pWindow = GetWindow();
120cdf0e10cSrcweir 	if ( pWindow )
121cdf0e10cSrcweir 	{
122cdf0e10cSrcweir 		WinBits nStyle = pWindow->GetStyle();
123cdf0e10cSrcweir 		if ( bEnable )
124cdf0e10cSrcweir 			nStyle |= WB_DIALOGCONTROL;
125cdf0e10cSrcweir 		else
126cdf0e10cSrcweir 			nStyle &= (~WB_DIALOGCONTROL);
127cdf0e10cSrcweir 		pWindow->SetStyle( nStyle );
128cdf0e10cSrcweir 	}
129cdf0e10cSrcweir }
130cdf0e10cSrcweir 
setTabOrder(const::com::sun::star::uno::Sequence<::com::sun::star::uno::Reference<::com::sun::star::awt::XWindow>> & Components,const::com::sun::star::uno::Sequence<::com::sun::star::uno::Any> & Tabs,sal_Bool bGroupControl)131cdf0e10cSrcweir void VCLXContainer::setTabOrder( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > >& Components, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Tabs, sal_Bool bGroupControl ) throw(::com::sun::star::uno::RuntimeException)
132cdf0e10cSrcweir {
133cdf0e10cSrcweir 	::vos::OGuard aGuard( GetMutex() );
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 	sal_uInt32 nCount = Components.getLength();
136cdf0e10cSrcweir 	DBG_ASSERT( nCount == (sal_uInt32)Tabs.getLength(), "setTabOrder: TabCount != ComponentCount" );
137cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > * pComps = Components.getConstArray();
138cdf0e10cSrcweir 	const ::com::sun::star::uno::Any* pTabs = Tabs.getConstArray();
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 	Window* pPrevWin = NULL;
141cdf0e10cSrcweir 	for ( sal_uInt32 n = 0; n < nCount; n++ )
142cdf0e10cSrcweir 	{
143cdf0e10cSrcweir 		// ::com::sun::star::style::TabStop
144cdf0e10cSrcweir 		Window* pWin = VCLUnoHelper::GetWindow( pComps[n] );
145cdf0e10cSrcweir 		// NULL kann vorkommen, wenn die ::com::sun::star::uno::Sequence vom TabController kommt und eine Peer fehlt!
146cdf0e10cSrcweir 		if ( pWin )
147cdf0e10cSrcweir 		{
148cdf0e10cSrcweir 			// Reihenfolge der Fenster vor der Manipulation des Styles,
149cdf0e10cSrcweir 			// weil z.B. der RadioButton in StateChanged das PREV-Window beruecksichtigt.
150cdf0e10cSrcweir 			if ( pPrevWin )
151cdf0e10cSrcweir 				pWin->SetZOrder( pPrevWin, WINDOW_ZORDER_BEHIND );
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 			WinBits nStyle = pWin->GetStyle();
154cdf0e10cSrcweir 			nStyle &= ~(WB_TABSTOP|WB_NOTABSTOP|WB_GROUP);
155cdf0e10cSrcweir 			if ( pTabs[n].getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_BOOLEAN )
156cdf0e10cSrcweir 			{
157cdf0e10cSrcweir 				sal_Bool bTab = false;
158cdf0e10cSrcweir 				pTabs[n] >>= bTab;
159cdf0e10cSrcweir 				nStyle |= ( bTab ? WB_TABSTOP : WB_NOTABSTOP );
160cdf0e10cSrcweir 			}
161cdf0e10cSrcweir 			pWin->SetStyle( nStyle );
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 			if ( bGroupControl )
164cdf0e10cSrcweir 			{
165cdf0e10cSrcweir 				if ( n == 0 )
166cdf0e10cSrcweir 					pWin->SetDialogControlStart( sal_True );
167cdf0e10cSrcweir 				else
168cdf0e10cSrcweir 					pWin->SetDialogControlStart( sal_False );
169cdf0e10cSrcweir 			}
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 			pPrevWin = pWin;
172cdf0e10cSrcweir 		}
173cdf0e10cSrcweir 	}
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
setGroup(const::com::sun::star::uno::Sequence<::com::sun::star::uno::Reference<::com::sun::star::awt::XWindow>> & Components)176cdf0e10cSrcweir void VCLXContainer::setGroup( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > >& Components ) throw(::com::sun::star::uno::RuntimeException)
177cdf0e10cSrcweir {
178cdf0e10cSrcweir 	::vos::OGuard aGuard( GetMutex() );
179cdf0e10cSrcweir 
180cdf0e10cSrcweir 	sal_uInt32 nCount = Components.getLength();
181cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > * pComps = Components.getConstArray();
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	Window* pPrevWin = NULL;
184cdf0e10cSrcweir 	Window* pPrevRadio = NULL;
185cdf0e10cSrcweir 	for ( sal_uInt32 n = 0; n < nCount; n++ )
186cdf0e10cSrcweir 	{
187cdf0e10cSrcweir 		Window* pWin = VCLUnoHelper::GetWindow( pComps[n] );
188cdf0e10cSrcweir 		if ( pWin )
189cdf0e10cSrcweir 		{
190cdf0e10cSrcweir 			Window* pSortBehind = pPrevWin;
191cdf0e10cSrcweir 			// #57096# Alle Radios hintereinander sortieren...
192cdf0e10cSrcweir 			sal_Bool bNewPrevWin = sal_True;
193cdf0e10cSrcweir 			if ( pWin->GetType() == WINDOW_RADIOBUTTON )
194cdf0e10cSrcweir 			{
195cdf0e10cSrcweir 				if ( pPrevRadio )
196cdf0e10cSrcweir 				{
197cdf0e10cSrcweir 					bNewPrevWin = ( pPrevWin == pPrevRadio );	// Radio-Button wurde vor das PreWin sortiert....
198cdf0e10cSrcweir 					pSortBehind = pPrevRadio;
199cdf0e10cSrcweir 				}
200cdf0e10cSrcweir 				pPrevRadio = pWin;
201cdf0e10cSrcweir 			}
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 			// Z-Order
204cdf0e10cSrcweir 			if ( pSortBehind )
205cdf0e10cSrcweir 				pWin->SetZOrder( pSortBehind, WINDOW_ZORDER_BEHIND );
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 			WinBits nStyle = pWin->GetStyle();
208cdf0e10cSrcweir 			if ( n == 0 )
209cdf0e10cSrcweir 				nStyle |= WB_GROUP;
210cdf0e10cSrcweir 			else
211cdf0e10cSrcweir 				nStyle &= (~WB_GROUP);
212cdf0e10cSrcweir 			pWin->SetStyle( nStyle );
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 			// Ein WB_GROUP hinter die Gruppe, falls keine Gruppe mehr folgt.
215cdf0e10cSrcweir 			if ( n == ( nCount - 1 ) )
216cdf0e10cSrcweir 			{
217cdf0e10cSrcweir 				Window* pBehindLast = pWin->GetWindow( WINDOW_NEXT );
218cdf0e10cSrcweir 				if ( pBehindLast )
219cdf0e10cSrcweir 				{
220cdf0e10cSrcweir 					WinBits nLastStyle = pBehindLast->GetStyle();
221cdf0e10cSrcweir 					nLastStyle |= WB_GROUP;
222cdf0e10cSrcweir 					pBehindLast->SetStyle( nLastStyle );
223cdf0e10cSrcweir 				}
224cdf0e10cSrcweir 			}
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 			if ( bNewPrevWin )
227cdf0e10cSrcweir 				pPrevWin = pWin;
228cdf0e10cSrcweir 		}
229cdf0e10cSrcweir 	}
230cdf0e10cSrcweir }
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 
236