xref: /trunk/main/toolkit/source/awt/vclxcontainer.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_toolkit.hxx"
30 
31 
32 #include <toolkit/awt/vclxcontainer.hxx>
33 #include <toolkit/helper/macros.hxx>
34 #include <toolkit/helper/vclunohelper.hxx>
35 #include <cppuhelper/typeprovider.hxx>
36 #include <rtl/memory.h>
37 #include <rtl/uuid.h>
38 
39 #include <vcl/window.hxx>
40 #include <tools/debug.hxx>
41 
42 //  ----------------------------------------------------
43 //  class VCLXContainer
44 //  ----------------------------------------------------
45 
46 void VCLXContainer::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
47 {
48     VCLXWindow::ImplGetPropertyIds( rIds );
49 }
50 
51 VCLXContainer::VCLXContainer()
52 {
53 }
54 
55 VCLXContainer::~VCLXContainer()
56 {
57 }
58 
59 // ::com::sun::star::uno::XInterface
60 ::com::sun::star::uno::Any VCLXContainer::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
61 {
62     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
63                                         SAL_STATIC_CAST( ::com::sun::star::awt::XVclContainer*, this ),
64                                         SAL_STATIC_CAST( ::com::sun::star::awt::XVclContainerPeer*, this ) );
65     return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
66 }
67 
68 // ::com::sun::star::lang::XTypeProvider
69 IMPL_XTYPEPROVIDER_START( VCLXContainer )
70     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XVclContainer>* ) NULL ),
71     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XVclContainerPeer>* ) NULL ),
72     VCLXWindow::getTypes()
73 IMPL_XTYPEPROVIDER_END
74 
75 
76 // ::com::sun::star::awt::XVclContainer
77 void VCLXContainer::addVclContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XVclContainerListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException)
78 {
79     ::vos::OGuard aGuard( GetMutex() );
80 
81     GetContainerListeners().addInterface( rxListener );
82 }
83 
84 void VCLXContainer::removeVclContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XVclContainerListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException)
85 {
86     ::vos::OGuard aGuard( GetMutex() );
87 
88     GetContainerListeners().removeInterface( rxListener );
89 }
90 
91 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > > VCLXContainer::getWindows(  ) throw(::com::sun::star::uno::RuntimeException)
92 {
93     ::vos::OGuard aGuard( GetMutex() );
94 
95     // Bei allen Childs das Container-Interface abfragen...
96     ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > > aSeq;
97     Window* pWindow = GetWindow();
98     if ( pWindow )
99     {
100         sal_uInt16 nChilds = pWindow->GetChildCount();
101         if ( nChilds )
102         {
103             aSeq = ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > >( nChilds );
104             ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > * pChildRefs = aSeq.getArray();
105             for ( sal_uInt16 n = 0; n < nChilds; n++ )
106             {
107                 Window* pChild = pWindow->GetChild( n );
108                 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >  xWP = pChild->GetComponentInterface( sal_True );
109                 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xW( xWP, ::com::sun::star::uno::UNO_QUERY );
110                 pChildRefs[n] = xW;
111             }
112         }
113     }
114     return aSeq;
115 }
116 
117 
118 // ::com::sun::star::awt::XVclContainerPeer
119 void VCLXContainer::enableDialogControl( sal_Bool bEnable ) throw(::com::sun::star::uno::RuntimeException)
120 {
121     ::vos::OGuard aGuard( GetMutex() );
122 
123     Window* pWindow = GetWindow();
124     if ( pWindow )
125     {
126         WinBits nStyle = pWindow->GetStyle();
127         if ( bEnable )
128             nStyle |= WB_DIALOGCONTROL;
129         else
130             nStyle &= (~WB_DIALOGCONTROL);
131         pWindow->SetStyle( nStyle );
132     }
133 }
134 
135 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)
136 {
137     ::vos::OGuard aGuard( GetMutex() );
138 
139     sal_uInt32 nCount = Components.getLength();
140     DBG_ASSERT( nCount == (sal_uInt32)Tabs.getLength(), "setTabOrder: TabCount != ComponentCount" );
141     const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > * pComps = Components.getConstArray();
142     const ::com::sun::star::uno::Any* pTabs = Tabs.getConstArray();
143 
144     Window* pPrevWin = NULL;
145     for ( sal_uInt32 n = 0; n < nCount; n++ )
146     {
147         // ::com::sun::star::style::TabStop
148         Window* pWin = VCLUnoHelper::GetWindow( pComps[n] );
149         // NULL kann vorkommen, wenn die ::com::sun::star::uno::Sequence vom TabController kommt und eine Peer fehlt!
150         if ( pWin )
151         {
152             // Reihenfolge der Fenster vor der Manipulation des Styles,
153             // weil z.B. der RadioButton in StateChanged das PREV-Window beruecksichtigt.
154             if ( pPrevWin )
155                 pWin->SetZOrder( pPrevWin, WINDOW_ZORDER_BEHIND );
156 
157             WinBits nStyle = pWin->GetStyle();
158             nStyle &= ~(WB_TABSTOP|WB_NOTABSTOP|WB_GROUP);
159             if ( pTabs[n].getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_BOOLEAN )
160             {
161                 sal_Bool bTab = false;
162                 pTabs[n] >>= bTab;
163                 nStyle |= ( bTab ? WB_TABSTOP : WB_NOTABSTOP );
164             }
165             pWin->SetStyle( nStyle );
166 
167             if ( bGroupControl )
168             {
169                 if ( n == 0 )
170                     pWin->SetDialogControlStart( sal_True );
171                 else
172                     pWin->SetDialogControlStart( sal_False );
173             }
174 
175             pPrevWin = pWin;
176         }
177     }
178 }
179 
180 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)
181 {
182     ::vos::OGuard aGuard( GetMutex() );
183 
184     sal_uInt32 nCount = Components.getLength();
185     const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > * pComps = Components.getConstArray();
186 
187     Window* pPrevWin = NULL;
188     Window* pPrevRadio = NULL;
189     for ( sal_uInt32 n = 0; n < nCount; n++ )
190     {
191         Window* pWin = VCLUnoHelper::GetWindow( pComps[n] );
192         if ( pWin )
193         {
194             Window* pSortBehind = pPrevWin;
195             // #57096# Alle Radios hintereinander sortieren...
196             sal_Bool bNewPrevWin = sal_True;
197             if ( pWin->GetType() == WINDOW_RADIOBUTTON )
198             {
199                 if ( pPrevRadio )
200                 {
201                     bNewPrevWin = ( pPrevWin == pPrevRadio );   // Radio-Button wurde vor das PreWin sortiert....
202                     pSortBehind = pPrevRadio;
203                 }
204                 pPrevRadio = pWin;
205             }
206 
207             // Z-Order
208             if ( pSortBehind )
209                 pWin->SetZOrder( pSortBehind, WINDOW_ZORDER_BEHIND );
210 
211             WinBits nStyle = pWin->GetStyle();
212             if ( n == 0 )
213                 nStyle |= WB_GROUP;
214             else
215                 nStyle &= (~WB_GROUP);
216             pWin->SetStyle( nStyle );
217 
218             // Ein WB_GROUP hinter die Gruppe, falls keine Gruppe mehr folgt.
219             if ( n == ( nCount - 1 ) )
220             {
221                 Window* pBehindLast = pWin->GetWindow( WINDOW_NEXT );
222                 if ( pBehindLast )
223                 {
224                     WinBits nLastStyle = pBehindLast->GetStyle();
225                     nLastStyle |= WB_GROUP;
226                     pBehindLast->SetStyle( nLastStyle );
227                 }
228             }
229 
230             if ( bNewPrevWin )
231                 pPrevWin = pWin;
232         }
233     }
234 }
235 
236 
237 
238 
239 
240