1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "vclxtabcontrol.hxx"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/PosSize.hpp>
27*b1cdbd2cSJim Jagielski #include <sal/macros.h>
28*b1cdbd2cSJim Jagielski #include <toolkit/helper/property.hxx>
29*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
30*b1cdbd2cSJim Jagielski #include <vcl/tabctrl.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/tabpage.hxx>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include "forward.hxx"
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski namespace layoutimpl
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
39*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
40*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
41*b1cdbd2cSJim Jagielski 
ChildProps(VCLXTabControl::ChildData * pData)42*b1cdbd2cSJim Jagielski VCLXTabControl::ChildProps::ChildProps( VCLXTabControl::ChildData *pData )
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski     addProp( RTL_CONSTASCII_USTRINGPARAM( "Title" ),
45*b1cdbd2cSJim Jagielski              ::getCppuType( static_cast< const rtl::OUString* >( NULL ) ),
46*b1cdbd2cSJim Jagielski              &(pData->maTitle) );
47*b1cdbd2cSJim Jagielski }
48*b1cdbd2cSJim Jagielski 
ChildData(uno::Reference<awt::XLayoutConstrains> const & xChild)49*b1cdbd2cSJim Jagielski VCLXTabControl::ChildData::ChildData( uno::Reference< awt::XLayoutConstrains > const& xChild )
50*b1cdbd2cSJim Jagielski     : Box_Base::ChildData( xChild )
51*b1cdbd2cSJim Jagielski     , maTitle()
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski }
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski VCLXTabControl::ChildData*
createChild(uno::Reference<awt::XLayoutConstrains> const & xChild)56*b1cdbd2cSJim Jagielski VCLXTabControl::createChild( uno::Reference< awt::XLayoutConstrains > const& xChild )
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski     return new ChildData( xChild );
59*b1cdbd2cSJim Jagielski }
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski VCLXTabControl::ChildProps*
createChildProps(Box_Base::ChildData * pData)62*b1cdbd2cSJim Jagielski VCLXTabControl::createChildProps( Box_Base::ChildData *pData )
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski     return new ChildProps( static_cast<VCLXTabControl::ChildData*> ( pData ) );
65*b1cdbd2cSJim Jagielski }
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski DBG_NAME( VCLXTabControl );
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski #if !defined (__GNUC__)
70*b1cdbd2cSJim Jagielski #define __PRETTY_FUNCTION__ __FUNCTION__
71*b1cdbd2cSJim Jagielski #endif /* !__GNUC__ */
72*b1cdbd2cSJim Jagielski 
VCLXTabControl()73*b1cdbd2cSJim Jagielski VCLXTabControl::VCLXTabControl()
74*b1cdbd2cSJim Jagielski   : VCLXWindow()
75*b1cdbd2cSJim Jagielski   , VCLXTabControl_Base()
76*b1cdbd2cSJim Jagielski   , Box_Base()
77*b1cdbd2cSJim Jagielski   , mTabId (1)
78*b1cdbd2cSJim Jagielski   , bRealized (false)
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski #ifndef __SUNPRO_CC
81*b1cdbd2cSJim Jagielski     OSL_TRACE ("\n********%s:%x", __PRETTY_FUNCTION__, this);
82*b1cdbd2cSJim Jagielski #endif
83*b1cdbd2cSJim Jagielski     DBG_CTOR( VCLXTabControl, NULL );
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski 
~VCLXTabControl()86*b1cdbd2cSJim Jagielski VCLXTabControl::~VCLXTabControl()
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski     DBG_DTOR( VCLXTabControl, NULL );
89*b1cdbd2cSJim Jagielski }
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski IMPLEMENT_2_FORWARD_XINTERFACE2( VCLXTabControl, VCLXWindow, Container, VCLXTabControl_Base );
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXTabControl, VCLXWindow, VCLXTabControl_Base );
94*b1cdbd2cSJim Jagielski 
dispose()95*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::dispose( ) throw(uno::RuntimeException)
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski     {
98*b1cdbd2cSJim Jagielski         ::vos::OGuard aGuard( GetMutex() );
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski         EventObject aDisposeEvent;
101*b1cdbd2cSJim Jagielski         aDisposeEvent.Source = W3K_EXPLICIT_CAST (*this);
102*b1cdbd2cSJim Jagielski //            maTabListeners.disposeAndClear( aDisposeEvent );
103*b1cdbd2cSJim Jagielski     }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski     VCLXWindow::dispose();
106*b1cdbd2cSJim Jagielski }
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski #if 0
109*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::addTabListener( const Reference< XTabListener >& listener ) throw (uno::RuntimeException)
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski     if ( listener.is() )
112*b1cdbd2cSJim Jagielski         maTabListeners.addInterface( listener );
113*b1cdbd2cSJim Jagielski }
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::removeTabListener( const Reference< XTabListener >& listener ) throw (uno::RuntimeException)
116*b1cdbd2cSJim Jagielski {
117*b1cdbd2cSJim Jagielski     if ( listener.is() )
118*b1cdbd2cSJim Jagielski         maTabListeners.removeInterface( listener );
119*b1cdbd2cSJim Jagielski }
120*b1cdbd2cSJim Jagielski #endif
121*b1cdbd2cSJim Jagielski 
getTabControl() const122*b1cdbd2cSJim Jagielski TabControl *VCLXTabControl::getTabControl() const throw (uno::RuntimeException)
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski     TabControl *pTabControl = static_cast< TabControl* >( GetWindow() );
125*b1cdbd2cSJim Jagielski     if ( pTabControl )
126*b1cdbd2cSJim Jagielski         return pTabControl;
127*b1cdbd2cSJim Jagielski     throw uno::RuntimeException();
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski 
insertTab()130*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL VCLXTabControl::insertTab() throw (uno::RuntimeException)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski     TabControl *pTabControl = getTabControl();
133*b1cdbd2cSJim Jagielski     sal_uInt16 id = sal::static_int_cast< sal_uInt16 >( mTabId++ );
134*b1cdbd2cSJim Jagielski     rtl::OUString title (RTL_CONSTASCII_USTRINGPARAM( "" ) );
135*b1cdbd2cSJim Jagielski     pTabControl->InsertPage( id, title.getStr(), TAB_APPEND );
136*b1cdbd2cSJim Jagielski     pTabControl->SetTabPage( id, new TabPage( pTabControl ) );
137*b1cdbd2cSJim Jagielski     return id;
138*b1cdbd2cSJim Jagielski }
139*b1cdbd2cSJim Jagielski 
removeTab(sal_Int32 ID)140*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::removeTab( sal_Int32 ID ) throw (uno::RuntimeException, IndexOutOfBoundsException)
141*b1cdbd2cSJim Jagielski {
142*b1cdbd2cSJim Jagielski     TabControl *pTabControl = getTabControl();
143*b1cdbd2cSJim Jagielski     if ( pTabControl->GetTabPage( sal::static_int_cast< sal_uInt16 >( ID ) ) == NULL )
144*b1cdbd2cSJim Jagielski         throw IndexOutOfBoundsException();
145*b1cdbd2cSJim Jagielski     pTabControl->RemovePage( sal::static_int_cast< sal_uInt16 >( ID ) );
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski 
activateTab(sal_Int32 ID)148*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::activateTab( sal_Int32 ID ) throw (uno::RuntimeException, IndexOutOfBoundsException)
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski     TabControl *pTabControl = getTabControl();
151*b1cdbd2cSJim Jagielski     if ( pTabControl->GetTabPage( sal::static_int_cast< sal_uInt16 >( ID ) ) == NULL )
152*b1cdbd2cSJim Jagielski         throw IndexOutOfBoundsException();
153*b1cdbd2cSJim Jagielski     pTabControl->SelectTabPage( sal::static_int_cast< sal_uInt16 >( ID ) );
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
getActiveTabID()156*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL VCLXTabControl::getActiveTabID() throw (uno::RuntimeException)
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski     return getTabControl()->GetCurPageId( );
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
addTabListener(const uno::Reference<awt::XTabListener> & xListener)161*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::addTabListener( const uno::Reference< awt::XTabListener >& xListener ) throw (uno::RuntimeException)
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski     for ( std::list< uno::Reference
164*b1cdbd2cSJim Jagielski               < awt::XTabListener > >::const_iterator it
165*b1cdbd2cSJim Jagielski               = mxTabListeners.begin(); it != mxTabListeners.end(); it++ )
166*b1cdbd2cSJim Jagielski     {
167*b1cdbd2cSJim Jagielski         if ( *it == xListener )
168*b1cdbd2cSJim Jagielski             // already added
169*b1cdbd2cSJim Jagielski             return;
170*b1cdbd2cSJim Jagielski     }
171*b1cdbd2cSJim Jagielski     mxTabListeners.push_back( xListener );
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski 
removeTabListener(const uno::Reference<awt::XTabListener> & xListener)174*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::removeTabListener( const uno::Reference< awt::XTabListener >& xListener ) throw (uno::RuntimeException)
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski     for ( std::list< uno::Reference
177*b1cdbd2cSJim Jagielski               < awt::XTabListener > >::iterator it
178*b1cdbd2cSJim Jagielski               = mxTabListeners.begin(); it != mxTabListeners.end(); it++ )
179*b1cdbd2cSJim Jagielski     {
180*b1cdbd2cSJim Jagielski         if ( *it == xListener )
181*b1cdbd2cSJim Jagielski         {
182*b1cdbd2cSJim Jagielski             mxTabListeners.erase( it );
183*b1cdbd2cSJim Jagielski             break;
184*b1cdbd2cSJim Jagielski         }
185*b1cdbd2cSJim Jagielski     }
186*b1cdbd2cSJim Jagielski }
187*b1cdbd2cSJim Jagielski 
setTabProps(sal_Int32 ID,const uno::Sequence<NamedValue> & Properties)188*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::setTabProps( sal_Int32 ID, const uno::Sequence< NamedValue >& Properties ) throw (uno::RuntimeException, IndexOutOfBoundsException)
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski     TabControl *pTabControl = getTabControl();
191*b1cdbd2cSJim Jagielski     if ( pTabControl->GetTabPage( sal::static_int_cast< sal_uInt16 >( ID ) ) == NULL )
192*b1cdbd2cSJim Jagielski         throw IndexOutOfBoundsException();
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski     for ( int i = 0; i < Properties.getLength(); i++ )
195*b1cdbd2cSJim Jagielski     {
196*b1cdbd2cSJim Jagielski         const rtl::OUString &name = Properties[i].Name;
197*b1cdbd2cSJim Jagielski         const uno::Any &value = Properties[i].Value;
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski         if ( name  == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ) )
200*b1cdbd2cSJim Jagielski         {
201*b1cdbd2cSJim Jagielski             rtl::OUString title = value.get<rtl::OUString>();
202*b1cdbd2cSJim Jagielski             pTabControl->SetPageText( sal::static_int_cast< sal_uInt16 >( ID ), title.getStr() );
203*b1cdbd2cSJim Jagielski         }
204*b1cdbd2cSJim Jagielski     }
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski 
getTabProps(sal_Int32 ID)207*b1cdbd2cSJim Jagielski uno::Sequence< NamedValue > SAL_CALL VCLXTabControl::getTabProps( sal_Int32 ID )
208*b1cdbd2cSJim Jagielski     throw (IndexOutOfBoundsException, uno::RuntimeException)
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski     TabControl *pTabControl = getTabControl();
211*b1cdbd2cSJim Jagielski     if ( pTabControl->GetTabPage( sal::static_int_cast< sal_uInt16 >( ID ) ) == NULL )
212*b1cdbd2cSJim Jagielski         throw IndexOutOfBoundsException();
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski #define ADD_PROP( seq, i, name, val ) {                                \
215*b1cdbd2cSJim Jagielski         NamedValue value;                                                  \
216*b1cdbd2cSJim Jagielski         value.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( name ) ); \
217*b1cdbd2cSJim Jagielski         value.Value = uno::makeAny( val );                                      \
218*b1cdbd2cSJim Jagielski         seq[i] = value;                                                    \
219*b1cdbd2cSJim Jagielski     }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski     uno::Sequence< NamedValue > props( 2 );
222*b1cdbd2cSJim Jagielski     ADD_PROP( props, 0, "Title", rtl::OUString( pTabControl->GetPageText( sal::static_int_cast< sal_uInt16 >( ID ) ) ) );
223*b1cdbd2cSJim Jagielski     ADD_PROP( props, 1, "Position", pTabControl->GetPagePos( sal::static_int_cast< sal_uInt16 >( ID ) ) );
224*b1cdbd2cSJim Jagielski #undef ADD_PROP
225*b1cdbd2cSJim Jagielski     return props;
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski // TODO: draw tab border here
draw(sal_Int32 nX,sal_Int32 nY)229*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::draw( sal_Int32 nX, sal_Int32 nY ) throw(uno::RuntimeException)
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard( GetMutex() );
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski     TabControl *pTabControl = getTabControl();
234*b1cdbd2cSJim Jagielski     TabPage *pTabPage = pTabControl->GetTabPage( sal::static_int_cast< sal_uInt16 >(  getActiveTabID() ) );
235*b1cdbd2cSJim Jagielski     if ( pTabPage )
236*b1cdbd2cSJim Jagielski     {
237*b1cdbd2cSJim Jagielski         ::Point aPos( nX, nY );
238*b1cdbd2cSJim Jagielski         ::Size  aSize = pTabPage->GetSizePixel();
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 		OutputDevice* pDev = VCLUnoHelper::GetOutputDevice( getGraphics() );
241*b1cdbd2cSJim Jagielski         aPos  = pDev->PixelToLogic( aPos );
242*b1cdbd2cSJim Jagielski         aSize = pDev->PixelToLogic( aSize );
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski         pTabPage->Draw( pDev, aPos, aSize, 0 );
245*b1cdbd2cSJim Jagielski     }
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     VCLXWindow::draw( nX, nY );
248*b1cdbd2cSJim Jagielski }
249*b1cdbd2cSJim Jagielski 
AddChild(uno::Reference<awt::XLayoutConstrains> const & xChild)250*b1cdbd2cSJim Jagielski void VCLXTabControl::AddChild (uno::Reference< awt::XLayoutConstrains > const& xChild)
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski {
253*b1cdbd2cSJim Jagielski #ifndef __SUNPRO_CC
254*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: children: %d", __PRETTY_FUNCTION__, maChildren.size ());
255*b1cdbd2cSJim Jagielski #endif
256*b1cdbd2cSJim Jagielski     mIdMap[ xChild ] = mTabId++;
257*b1cdbd2cSJim Jagielski     Box_Base::AddChild( xChild );
258*b1cdbd2cSJim Jagielski #ifndef __SUNPRO_CC
259*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: children: %d", __PRETTY_FUNCTION__, maChildren.size ());
260*b1cdbd2cSJim Jagielski #endif
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski 
addChild(const uno::Reference<awt::XLayoutConstrains> & xChild)263*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::addChild(
264*b1cdbd2cSJim Jagielski     const uno::Reference< awt::XLayoutConstrains > &xChild )
265*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException, awt::MaxChildrenException)
266*b1cdbd2cSJim Jagielski {
267*b1cdbd2cSJim Jagielski     mIdMap[ xChild ] = insertTab();
268*b1cdbd2cSJim Jagielski     Box_Base::addChild( xChild );
269*b1cdbd2cSJim Jagielski }
270*b1cdbd2cSJim Jagielski 
removeChild(const uno::Reference<awt::XLayoutConstrains> & xChild)271*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::removeChild( const uno::Reference< awt::XLayoutConstrains > &xChild )
272*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski     removeTab( mIdMap[xChild] );
275*b1cdbd2cSJim Jagielski     mIdMap[ xChild ] = -1;
276*b1cdbd2cSJim Jagielski     Box_Base::removeChild( xChild );
277*b1cdbd2cSJim Jagielski }
278*b1cdbd2cSJim Jagielski 
setChildrenVisible(uno::Reference<awt::XLayoutConstrains> xChild,bool visible)279*b1cdbd2cSJim Jagielski static void setChildrenVisible( uno::Reference < awt::XLayoutConstrains > xChild, bool visible )
280*b1cdbd2cSJim Jagielski {
281*b1cdbd2cSJim Jagielski     uno::Reference< awt::XWindow > xWin( xChild, uno::UNO_QUERY);
282*b1cdbd2cSJim Jagielski     if ( xWin.is() )
283*b1cdbd2cSJim Jagielski     {
284*b1cdbd2cSJim Jagielski         xWin->setVisible( visible );
285*b1cdbd2cSJim Jagielski     }
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski     uno::Reference < awt::XLayoutContainer > xCont( xChild, uno::UNO_QUERY );
288*b1cdbd2cSJim Jagielski     if ( xCont.is())
289*b1cdbd2cSJim Jagielski     {
290*b1cdbd2cSJim Jagielski         uno::Sequence< uno::Reference < awt::XLayoutConstrains > > children = xCont->getChildren();
291*b1cdbd2cSJim Jagielski         for ( int i = 0; i < children.getLength(); i++ )
292*b1cdbd2cSJim Jagielski         {
293*b1cdbd2cSJim Jagielski             setChildrenVisible( children[i], visible );
294*b1cdbd2cSJim Jagielski         }
295*b1cdbd2cSJim Jagielski     }
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski 
allocateArea(awt::Rectangle const & area)298*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::allocateArea (awt::Rectangle const &area)
299*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski #ifndef __SUNPRO_CC
302*b1cdbd2cSJim Jagielski     OSL_TRACE ("\n%s", __PRETTY_FUNCTION__);
303*b1cdbd2cSJim Jagielski #endif
304*b1cdbd2cSJim Jagielski     maAllocation = area;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski     TabControl *pTabControl = getTabControl();
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski // FIXME: this is wrong. We just want to set tab controls pos/size for
309*b1cdbd2cSJim Jagielski // the tabs menu, otherwise, it gets events that should go to children
310*b1cdbd2cSJim Jagielski // (I guess we could solve this by making the tabcontrol as the actual
311*b1cdbd2cSJim Jagielski // XWindow parent of its children, when importing...)  Not sure about
312*b1cdbd2cSJim Jagielski // TabPage drawing... That doesn't work on gtk+; just ignoring that.
313*b1cdbd2cSJim Jagielski // LATER: Nah, the proper fix is to get the XWindow hierarchy
314*b1cdbd2cSJim Jagielski // straight.
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski #if 0
317*b1cdbd2cSJim Jagielski     setPosSize( area.X, area.Y, area.Width, area.Height, awt::PosSize::POSSIZE );
318*b1cdbd2cSJim Jagielski #else
319*b1cdbd2cSJim Jagielski     awt::Size currentSize = getSize();
320*b1cdbd2cSJim Jagielski     awt::Size requestedSize (area.Width, area.Height);
321*b1cdbd2cSJim Jagielski //    requestedSize.Height = getHeightForWidth( area.Width );
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski     awt::Size minimumSize = getMinimumSize();
324*b1cdbd2cSJim Jagielski     if (requestedSize.Width < minimumSize.Width)
325*b1cdbd2cSJim Jagielski         requestedSize.Width = minimumSize.Width;
326*b1cdbd2cSJim Jagielski     if (requestedSize.Height < minimumSize.Height)
327*b1cdbd2cSJim Jagielski         requestedSize.Height = minimumSize.Height;
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski     Size pageSize = static_cast<TabControl*> (GetWindow ())->GetTabPageSizePixel ();
330*b1cdbd2cSJim Jagielski     awt::Size pageBasedSize (0, 0);
331*b1cdbd2cSJim Jagielski     pageBasedSize.Width = pageSize.Width ();
332*b1cdbd2cSJim Jagielski     pageBasedSize.Height = pageSize.Height ();
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski     const int wc = 0;
335*b1cdbd2cSJim Jagielski     const int hc = 20;
336*b1cdbd2cSJim Jagielski     static int pwc = 0;
337*b1cdbd2cSJim Jagielski     static int phc = 40;
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski     if (requestedSize.Width < pageBasedSize.Width)
340*b1cdbd2cSJim Jagielski         requestedSize.Width = pageBasedSize.Width + wc;
341*b1cdbd2cSJim Jagielski     if (requestedSize.Height < pageBasedSize.Height)
342*b1cdbd2cSJim Jagielski         requestedSize.Height = pageBasedSize.Height + hc;
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski     Size windowSize = GetWindow()->GetSizePixel();
345*b1cdbd2cSJim Jagielski     Window *parent = GetWindow()->GetParent();
346*b1cdbd2cSJim Jagielski     Size parentSize = parent->GetSizePixel();
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski #ifndef __SUNPRO_CC
349*b1cdbd2cSJim Jagielski #ifdef GCC_MAJOR
350*b1cdbd2cSJim Jagielski     OSL_TRACE ("\n%s", __PRETTY_FUNCTION__);
351*b1cdbd2cSJim Jagielski #endif /* GCC_MAJOR */
352*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: cursize: %d ,%d", __FUNCTION__, currentSize.Width, currentSize.Height );
353*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: area: %d, %d", __FUNCTION__, area.Width, area.Height );
354*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: minimum: %d, %d", __FUNCTION__, minimumSize.Width, minimumSize.Height );
355*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: requestedSize: %d, %d", __FUNCTION__, requestedSize.Width, requestedSize.Height );
356*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: pageBasedSize: %d, %d", __FUNCTION__, pageBasedSize.Width, pageBasedSize.Height );
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski     //OSL_TRACE ("%s: parent: %d, %d", __FUNCTION__, parentSize.Width(), parentSize.Height() );
359*b1cdbd2cSJim Jagielski     //OSL_TRACE ("%s: window: %d, %d", __FUNCTION__, windowSize.Width(), windowSize.Height() );
360*b1cdbd2cSJim Jagielski #endif
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski 	//bRealized = false;
363*b1cdbd2cSJim Jagielski     if (!bRealized)
364*b1cdbd2cSJim Jagielski     {
365*b1cdbd2cSJim Jagielski         setPosSize( area.X, area.Y, requestedSize.Width, requestedSize.Height, awt::PosSize::POSSIZE );
366*b1cdbd2cSJim Jagielski         bRealized = true;
367*b1cdbd2cSJim Jagielski     }
368*b1cdbd2cSJim Jagielski     else
369*b1cdbd2cSJim Jagielski     {
370*b1cdbd2cSJim Jagielski         if ( requestedSize.Width > currentSize.Width + 10)
371*b1cdbd2cSJim Jagielski             setPosSize( 0, 0, requestedSize.Width, 0, awt::PosSize::WIDTH );
372*b1cdbd2cSJim Jagielski         if ( requestedSize.Height > currentSize.Height + 10)
373*b1cdbd2cSJim Jagielski             setPosSize( 0, 0, 0, requestedSize.Height, awt::PosSize::HEIGHT );
374*b1cdbd2cSJim Jagielski     }
375*b1cdbd2cSJim Jagielski #endif
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski     if (pageBasedSize.Width > parentSize.Width ()
378*b1cdbd2cSJim Jagielski         || pageBasedSize.Height > parentSize.Height ())
379*b1cdbd2cSJim Jagielski         //parent->SetSizePixel ( Size (pageBasedSize.Width, pageBasedSize.Height));
380*b1cdbd2cSJim Jagielski         //parent->SetSizePixel ( Size (pageBasedSize.Width + pwc, pageBasedSize.Height + phc));
381*b1cdbd2cSJim Jagielski         parent->SetSizePixel ( Size (requestedSize.Width + pwc, requestedSize.Height + phc));
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski     // FIXME: we can save cycles by setting visibility more sensibly. Having
384*b1cdbd2cSJim Jagielski     // it here does makes it easier when changing tabs (just needs a recalc())
385*b1cdbd2cSJim Jagielski     unsigned i = 0;
386*b1cdbd2cSJim Jagielski     for ( std::list<Box_Base::ChildData *>::const_iterator it
387*b1cdbd2cSJim Jagielski               = maChildren.begin(); it != maChildren.end(); it++, i++ )
388*b1cdbd2cSJim Jagielski     {
389*b1cdbd2cSJim Jagielski         ChildData *child = static_cast<VCLXTabControl::ChildData*> ( *it );
390*b1cdbd2cSJim Jagielski         uno::Reference
391*b1cdbd2cSJim Jagielski               < awt::XLayoutConstrains > xChild( child->mxChild );
392*b1cdbd2cSJim Jagielski         if ( xChild.is() )
393*b1cdbd2cSJim Jagielski         {
394*b1cdbd2cSJim Jagielski             uno::Reference< awt::XWindow > xWin( xChild, uno::UNO_QUERY );
395*b1cdbd2cSJim Jagielski             bool active = (i+1 == (unsigned) getActiveTabID());
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski             // HACK: since our layout:: container don't implement XWindow, we have no easy
398*b1cdbd2cSJim Jagielski             // way to set them invisible; lets just set all their children as such :P
399*b1cdbd2cSJim Jagielski #if 0
400*b1cdbd2cSJim Jagielski             if ( xWin.is() )
401*b1cdbd2cSJim Jagielski                 xWin->setVisible( active );
402*b1cdbd2cSJim Jagielski #else
403*b1cdbd2cSJim Jagielski             setChildrenVisible( xChild, active );
404*b1cdbd2cSJim Jagielski #endif
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski             if ( active )
407*b1cdbd2cSJim Jagielski             {
408*b1cdbd2cSJim Jagielski                 ::Rectangle label_rect = pTabControl->GetTabBounds( sal::static_int_cast< sal_uInt16 >( i+1 ) );
409*b1cdbd2cSJim Jagielski                 ::Rectangle page_rect = pTabControl->GetTabPageBounds( sal::static_int_cast< sal_uInt16 >( i+1 ) );
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski                 awt::Rectangle childRect;
412*b1cdbd2cSJim Jagielski                 childRect.X = page_rect.Left();
413*b1cdbd2cSJim Jagielski                 childRect.Y = SAL_MAX( label_rect.Bottom(), page_rect.Top() );
414*b1cdbd2cSJim Jagielski                 childRect.Width = page_rect.Right() - page_rect.Left();
415*b1cdbd2cSJim Jagielski                 childRect.Height = page_rect.Bottom() - childRect.Y;
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski                 allocateChildAt( xChild, childRect );
418*b1cdbd2cSJim Jagielski             }
419*b1cdbd2cSJim Jagielski         }
420*b1cdbd2cSJim Jagielski     }
421*b1cdbd2cSJim Jagielski }
422*b1cdbd2cSJim Jagielski 
getMinimumSize()423*b1cdbd2cSJim Jagielski awt::Size SAL_CALL VCLXTabControl::getMinimumSize()
424*b1cdbd2cSJim Jagielski     throw(uno::RuntimeException)
425*b1cdbd2cSJim Jagielski {
426*b1cdbd2cSJim Jagielski     awt::Size requestedSize = VCLXWindow::getMinimumSize();
427*b1cdbd2cSJim Jagielski     awt::Size childrenSize( 0, 0 );
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski     TabControl* pTabControl = static_cast< TabControl* >( GetWindow() );
430*b1cdbd2cSJim Jagielski     if ( !pTabControl )
431*b1cdbd2cSJim Jagielski         return requestedSize;
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski     // calculate size to accomodate all children
434*b1cdbd2cSJim Jagielski     unsigned i = 0;
435*b1cdbd2cSJim Jagielski     for ( std::list<Box_Base::ChildData *>::const_iterator it
436*b1cdbd2cSJim Jagielski               = maChildren.begin(); it != maChildren.end(); it++, i++ )
437*b1cdbd2cSJim Jagielski     {
438*b1cdbd2cSJim Jagielski         ChildData *child = static_cast<VCLXTabControl::ChildData*> ( *it );
439*b1cdbd2cSJim Jagielski         if ( child->mxChild.is() )
440*b1cdbd2cSJim Jagielski         {
441*b1cdbd2cSJim Jagielski             // set the title prop here...
442*b1cdbd2cSJim Jagielski             pTabControl->SetPageText( sal::static_int_cast< sal_uInt16 >( i+1 ), child->maTitle.getStr() );
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski             awt::Size childSize( child->mxChild->getMinimumSize() );
445*b1cdbd2cSJim Jagielski             childrenSize.Width = SAL_MAX( childSize.Width, childrenSize.Width );
446*b1cdbd2cSJim Jagielski             childrenSize.Height = SAL_MAX( childSize.Height, childrenSize.Height );
447*b1cdbd2cSJim Jagielski         }
448*b1cdbd2cSJim Jagielski     }
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski #ifndef __SUNPRO_CC
451*b1cdbd2cSJim Jagielski #ifdef GCC_MAJOR
452*b1cdbd2cSJim Jagielski     OSL_TRACE ("\n%s", __PRETTY_FUNCTION__);
453*b1cdbd2cSJim Jagielski #endif /* GCC_MAJOR */
454*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: children: %d", __FUNCTION__, i);
455*b1cdbd2cSJim Jagielski     OSL_TRACE ("%s: childrenSize: %d, %d", __FUNCTION__, childrenSize.Width, childrenSize.Height );
456*b1cdbd2cSJim Jagielski #endif
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski     requestedSize.Width += childrenSize.Width;
459*b1cdbd2cSJim Jagielski     requestedSize.Height += childrenSize.Height + 20;
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski     maRequisition = requestedSize;
462*b1cdbd2cSJim Jagielski     return requestedSize;
463*b1cdbd2cSJim Jagielski }
464*b1cdbd2cSJim Jagielski 
ProcessWindowEvent(const VclWindowEvent & _rVclWindowEvent)465*b1cdbd2cSJim Jagielski void VCLXTabControl::ProcessWindowEvent( const VclWindowEvent& _rVclWindowEvent )
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski     ::vos::OClearableGuard aGuard( GetMutex() );
468*b1cdbd2cSJim Jagielski     TabControl* pTabControl = static_cast< TabControl* >( GetWindow() );
469*b1cdbd2cSJim Jagielski     if ( !pTabControl )
470*b1cdbd2cSJim Jagielski         return;
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski     switch ( _rVclWindowEvent.GetId() )
473*b1cdbd2cSJim Jagielski     {
474*b1cdbd2cSJim Jagielski         case VCLEVENT_TABPAGE_ACTIVATE:
475*b1cdbd2cSJim Jagielski             forceRecalc();
476*b1cdbd2cSJim Jagielski         case VCLEVENT_TABPAGE_DEACTIVATE:
477*b1cdbd2cSJim Jagielski         case VCLEVENT_TABPAGE_INSERTED:
478*b1cdbd2cSJim Jagielski         case VCLEVENT_TABPAGE_REMOVED:
479*b1cdbd2cSJim Jagielski         case VCLEVENT_TABPAGE_REMOVEDALL:
480*b1cdbd2cSJim Jagielski         case VCLEVENT_TABPAGE_PAGETEXTCHANGED:
481*b1cdbd2cSJim Jagielski         {
482*b1cdbd2cSJim Jagielski             sal_uLong page = (sal_uLong) _rVclWindowEvent.GetData();
483*b1cdbd2cSJim Jagielski             for ( std::list< uno::Reference
484*b1cdbd2cSJim Jagielski                       < awt::XTabListener > >::iterator it
485*b1cdbd2cSJim Jagielski                       = mxTabListeners.begin(); it != mxTabListeners.end(); it++)
486*b1cdbd2cSJim Jagielski             {
487*b1cdbd2cSJim Jagielski                 uno::Reference
488*b1cdbd2cSJim Jagielski                     < awt::XTabListener > listener = *it;
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski                 switch ( _rVclWindowEvent.GetId() )
491*b1cdbd2cSJim Jagielski                 {
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski                     case VCLEVENT_TABPAGE_ACTIVATE:
494*b1cdbd2cSJim Jagielski                         listener->activated( page );
495*b1cdbd2cSJim Jagielski                         break;
496*b1cdbd2cSJim Jagielski                     case VCLEVENT_TABPAGE_DEACTIVATE:
497*b1cdbd2cSJim Jagielski                         listener->deactivated( page );
498*b1cdbd2cSJim Jagielski                         break;
499*b1cdbd2cSJim Jagielski                     case VCLEVENT_TABPAGE_INSERTED:
500*b1cdbd2cSJim Jagielski                         listener->inserted( page );
501*b1cdbd2cSJim Jagielski                         break;
502*b1cdbd2cSJim Jagielski                     case VCLEVENT_TABPAGE_REMOVED:
503*b1cdbd2cSJim Jagielski                         listener->removed( page );
504*b1cdbd2cSJim Jagielski                         break;
505*b1cdbd2cSJim Jagielski                     case VCLEVENT_TABPAGE_REMOVEDALL:
506*b1cdbd2cSJim Jagielski                         for ( int i = 1; i < mTabId; i++)
507*b1cdbd2cSJim Jagielski                         {
508*b1cdbd2cSJim Jagielski                             if ( pTabControl->GetTabPage( sal::static_int_cast< sal_uInt16 >( i ) ) )
509*b1cdbd2cSJim Jagielski                                 listener->removed( i );
510*b1cdbd2cSJim Jagielski                         }
511*b1cdbd2cSJim Jagielski                         break;
512*b1cdbd2cSJim Jagielski                     case VCLEVENT_TABPAGE_PAGETEXTCHANGED:
513*b1cdbd2cSJim Jagielski                         listener->changed( page, getTabProps( page ) );
514*b1cdbd2cSJim Jagielski                         break;
515*b1cdbd2cSJim Jagielski                 }
516*b1cdbd2cSJim Jagielski             }
517*b1cdbd2cSJim Jagielski             break;
518*b1cdbd2cSJim Jagielski         }
519*b1cdbd2cSJim Jagielski         default:
520*b1cdbd2cSJim Jagielski             aGuard.clear();
521*b1cdbd2cSJim Jagielski             VCLXWindow::ProcessWindowEvent( _rVclWindowEvent );
522*b1cdbd2cSJim Jagielski             break;
523*b1cdbd2cSJim Jagielski     }
524*b1cdbd2cSJim Jagielski }
525*b1cdbd2cSJim Jagielski 
setProperty(const::rtl::OUString & PropertyName,const uno::Any & Value)526*b1cdbd2cSJim Jagielski void SAL_CALL VCLXTabControl::setProperty( const ::rtl::OUString& PropertyName, const uno::Any &Value ) throw(uno::RuntimeException)
527*b1cdbd2cSJim Jagielski {
528*b1cdbd2cSJim Jagielski     VCLXWindow::setProperty( PropertyName, Value );
529*b1cdbd2cSJim Jagielski }
530*b1cdbd2cSJim Jagielski 
getProperty(const::rtl::OUString & PropertyName)531*b1cdbd2cSJim Jagielski uno::Any SAL_CALL VCLXTabControl::getProperty( const ::rtl::OUString& PropertyName ) throw(uno::RuntimeException)
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski     return VCLXWindow::getProperty( PropertyName );
534*b1cdbd2cSJim Jagielski }
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski } // namespace layoutimpl
537