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