/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "vclxsplitter.hxx" #include #include #include #include #include #include #include "forward.hxx" namespace layoutimpl { using namespace ::com::sun::star::uno; using namespace ::com::sun::star::awt; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::beans; using namespace ::com::sun::star; VCLXSplitter::ChildProps::ChildProps( VCLXSplitter::ChildData *pData ) { addProp( RTL_CONSTASCII_USTRINGPARAM( "Shrink" ), ::getCppuType( static_cast< const rtl::OUString* >( NULL ) ), &(pData->mbShrink) ); } VCLXSplitter::ChildData::ChildData( uno::Reference< awt::XLayoutConstrains > const& xChild ) : Box_Base::ChildData( xChild ) , mbShrink( false ) { } VCLXSplitter::ChildData* VCLXSplitter::createChild( uno::Reference< awt::XLayoutConstrains > const& xChild ) { return new ChildData( xChild ); } VCLXSplitter::ChildProps* VCLXSplitter::createChildProps( Box_Base::ChildData *pData ) { return new ChildProps( static_cast ( pData ) ); } DBG_NAME( VCLXSplitter ); VCLXSplitter::VCLXSplitter( bool bHorizontal ) : VCLXWindow() , Box_Base() { DBG_CTOR( VCLXSplitter, NULL ); mnHandleRatio = 0.5; mbHandlePressed = false; mbHorizontal = bHorizontal; mpSplitter = NULL; } VCLXSplitter::~VCLXSplitter() { DBG_DTOR( VCLXSplitter, NULL ); } IMPLEMENT_2_FORWARD_XINTERFACE1( VCLXSplitter, VCLXWindow, Container ); IMPLEMENT_FORWARD_XTYPEPROVIDER1( VCLXSplitter, VCLXWindow ); VCLXSplitter::ChildData* VCLXSplitter::getChild( int i ) { if ( maChildren.size() && i == 0 ) return static_cast( maChildren.front() ); else if ( maChildren.size() > 1 && i == 1 ) return static_cast( maChildren.back() ); return 0; } void SAL_CALL VCLXSplitter::dispose() throw(RuntimeException) { { ::vos::OGuard aGuard( GetMutex() ); EventObject aDisposeEvent; aDisposeEvent.Source = W3K_EXPLICIT_CAST (*this); // maTabListeners.disposeAndClear( aDisposeEvent ); } VCLXWindow::dispose(); } void VCLXSplitter::ensureSplitter() { if ( !mpSplitter ) { mpSplitter = new Splitter( GetWindow() , mbHorizontal ? WB_HORZ : WB_VERT ); mpSplitter->Show(); mpSplitter->SetEndSplitHdl( LINK( this, VCLXSplitter, HandleMovedHdl ) ); } } void SAL_CALL VCLXSplitter::addChild( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XLayoutConstrains > &xChild ) throw (::com::sun::star::uno::RuntimeException, ::com::sun::star::awt::MaxChildrenException) { if ( maChildren.size() == 2 ) throw css::awt::MaxChildrenException(); Box_Base::addChild( xChild ); } void SAL_CALL VCLXSplitter::allocateArea( const ::com::sun::star::awt::Rectangle &rArea ) throw (::com::sun::star::uno::RuntimeException) { ensureSplitter(); // shouldn't be needed... getMinimumSize(); int splitDiff; if ( mbHorizontal ) splitDiff = rArea.Width - maAllocation.Width; else splitDiff = rArea.Height - maAllocation.Height; assert( mpSplitter ); if ( splitDiff ) mpSplitter->SetSplitPosPixel( mpSplitter->GetSplitPosPixel() + splitDiff/2 ); maAllocation = rArea; int width = mbHorizontal ? rArea.Width : rArea.Height; int splitLen = 2; int splitPos = mpSplitter->GetSplitPosPixel(); setPosSize( rArea.X, rArea.Y, rArea.Width, rArea.Height, PosSize::POSSIZE ); if ( mbHorizontal ) mpSplitter->SetPosSizePixel( splitPos, 0, splitLen, rArea.Height, PosSize::POSSIZE ); else mpSplitter->SetPosSizePixel( 0, splitPos, rArea.Width, splitLen, PosSize::POSSIZE ); mpSplitter->SetDragRectPixel( ::Rectangle( 0, 0, rArea.Width, rArea.Height ) ); int leftWidth = splitPos; int rightWidth = width - splitPos; if ( getChild( 0 ) && getChild( 0 )->mxChild.is() ) { awt::Rectangle childRect( 0, 0, rArea.Width, rArea.Height ); if ( mbHorizontal ) childRect.Width = leftWidth - 2; else childRect.Height = leftWidth - 2; allocateChildAt( getChild( 0 )->mxChild, childRect ); } if ( getChild( 0 ) && getChild( 0 )->mxChild.is() ) { awt::Rectangle childRect( 0, 0, rArea.Width, rArea.Height ); if ( mbHorizontal ) { childRect.X += leftWidth + splitLen + 2; childRect.Width = rightWidth; } else { childRect.Y += leftWidth + splitLen + 2; childRect.Height = rightWidth; } allocateChildAt( getChild( 1 )->mxChild, childRect ); } } ::com::sun::star::awt::Size SAL_CALL VCLXSplitter::getMinimumSize() throw(::com::sun::star::uno::RuntimeException) { ensureSplitter(); awt::Size size( mbHorizontal ? 2 : 0, mbHorizontal ? 0 : 2 ); for ( unsigned int i = 0; i < 2; i++ ) { if ( getChild( i ) && getChild( i )->mxChild.is() ) { awt::Size childSize = getChild( i )->mxChild->getMinimumSize(); if ( mbHorizontal ) { size.Width += childSize.Width; size.Height = SAL_MAX( size.Height, childSize.Height ); } else { size.Width = SAL_MAX( size.Width, childSize.Width ); size.Height += childSize.Height; } } } maRequisition = size; return size; } void VCLXSplitter::ProcessWindowEvent( const VclWindowEvent& _rVclWindowEvent ) { VCLXWindow::ProcessWindowEvent( _rVclWindowEvent ); } void SAL_CALL VCLXSplitter::setProperty( const ::rtl::OUString& PropertyName, const Any &Value ) throw(RuntimeException) { VCLXWindow::setProperty( PropertyName, Value ); } Any SAL_CALL VCLXSplitter::getProperty( const ::rtl::OUString& PropertyName ) throw(RuntimeException) { return VCLXWindow::getProperty( PropertyName ); } IMPL_LINK( VCLXSplitter, HandleMovedHdl, Splitter *, pSplitter ) { (void) pSplitter; forceRecalc(); return 0; } } // namespace layoutimpl