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