/************************************************************** * * 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 "precompiled_vcl.hxx" #include "vcl/window.hxx" #include "vcl/arrange.hxx" #include "window.h" #include "svdata.hxx" #include "brdwin.hxx" #include "com/sun/star/beans/PropertyValue.hpp" #include #include using namespace com::sun::star; namespace vcl { struct ExtWindowImpl { ExtWindowImpl() : mbOwnedByParent( false ) {} ~ExtWindowImpl() {} boost::shared_ptr< WindowArranger > mxLayout; bool mbOwnedByParent; rtl::OUString maIdentifier; }; } void Window::ImplDeleteOwnedChildren() { Window* pChild = mpWindowImpl->mpFirstChild; while ( pChild ) { Window* pDeleteCandidate = pChild; pChild = pChild->mpWindowImpl->mpNext; vcl::ExtWindowImpl* pDelImpl = pDeleteCandidate->ImplGetExtWindowImpl(); if( pDelImpl && pDelImpl->mbOwnedByParent ) delete pDeleteCandidate; } } void Window::ImplFreeExtWindowImpl() { ImplDeleteOwnedChildren(); if( mpWindowImpl ) { delete mpWindowImpl->mpExtImpl; mpWindowImpl->mpExtImpl = NULL; } } vcl::ExtWindowImpl* Window::ImplGetExtWindowImpl() const { vcl::ExtWindowImpl* pImpl = NULL; if( mpWindowImpl ) { if( ! mpWindowImpl->mpExtImpl && ! mpWindowImpl->mbInDtor ) mpWindowImpl->mpExtImpl = new vcl::ExtWindowImpl(); pImpl = mpWindowImpl->mpExtImpl; } return pImpl; } void Window::ImplExtResize() { if( mpWindowImpl && mpWindowImpl->mpExtImpl ) { if( mpWindowImpl->mpExtImpl->mxLayout.get() ) mpWindowImpl->mpExtImpl->mxLayout->setManagedArea( Rectangle( Point( 0, 0 ), GetSizePixel() ) ); } } boost::shared_ptr< vcl::WindowArranger > Window::getLayout() { boost::shared_ptr< vcl::WindowArranger > xRet; vcl::ExtWindowImpl* pImpl = ImplGetExtWindowImpl(); if( pImpl ) { if( ! pImpl->mxLayout.get() ) { pImpl->mxLayout.reset( new vcl::LabelColumn() ); pImpl->mxLayout->setParentWindow( this ); pImpl->mxLayout->setOuterBorder( -1 ); } xRet = pImpl->mxLayout; } return xRet; } void Window::addWindow( Window* i_pWin, bool i_bTakeOwnership ) { vcl::ExtWindowImpl* pImpl = ImplGetExtWindowImpl(); if( pImpl && i_pWin ) { vcl::ExtWindowImpl* pChildImpl = i_pWin->ImplGetExtWindowImpl(); if( pChildImpl ) { i_pWin->SetParent( this ); pChildImpl->mbOwnedByParent = i_bTakeOwnership; } } } Window* Window::removeWindow( Window* i_pWin, Window* i_pNewParent ) { Window* pRet = NULL; if( i_pWin ) { vcl::ExtWindowImpl* pImpl = ImplGetExtWindowImpl(); if( pImpl ) { vcl::ExtWindowImpl* pChildImpl = i_pWin->ImplGetExtWindowImpl(); if( pChildImpl ) { if( ! i_pNewParent ) pChildImpl->mbOwnedByParent = false; i_pWin->SetParent( i_pNewParent ); pRet = i_pWin; } } } return pRet; } Window* Window::findWindow( const rtl::OUString& i_rIdentifier ) const { if( getIdentifier() == i_rIdentifier ) return const_cast(this); Window* pChild = mpWindowImpl->mpFirstChild; while ( pChild ) { Window* pResult = pChild->findWindow( i_rIdentifier ); if( pResult ) return pResult; pChild = pChild->mpWindowImpl->mpNext; } return NULL; } const rtl::OUString& Window::getIdentifier() const { static rtl::OUString aEmptyStr; return (mpWindowImpl && mpWindowImpl->mpExtImpl) ? mpWindowImpl->mpExtImpl->maIdentifier : aEmptyStr; } void Window::setIdentifier( const rtl::OUString& i_rIdentifier ) { vcl::ExtWindowImpl* pImpl = ImplGetExtWindowImpl(); if( pImpl ) pImpl->maIdentifier = i_rIdentifier; } void Window::setProperties( const uno::Sequence< beans::PropertyValue >& i_rProps ) { const beans::PropertyValue* pVals = i_rProps.getConstArray(); for( sal_Int32 i = 0; i < i_rProps.getLength(); i++ ) { if( pVals[i].Name.equalsAscii( "Enabled" ) ) { sal_Bool bVal = sal_True; if( pVals[i].Value >>= bVal ) Enable( bVal ); } else if( pVals[i].Name.equalsAscii( "Visible" ) ) { sal_Bool bVal = sal_True; if( pVals[i].Value >>= bVal ) Show( bVal ); } else if( pVals[i].Name.equalsAscii( "Text" ) ) { rtl::OUString aText; if( pVals[i].Value >>= aText ) SetText( aText ); } } } uno::Sequence< beans::PropertyValue > Window::getProperties() const { uno::Sequence< beans::PropertyValue > aProps( 3 ); aProps[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Enabled" ) ); aProps[0].Value = uno::makeAny( sal_Bool( IsEnabled() ) ); aProps[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Visible" ) ); aProps[1].Value = uno::makeAny( sal_Bool( IsVisible() ) ); aProps[2].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Text" ) ); aProps[2].Value = uno::makeAny( rtl::OUString( GetText() ) ); return aProps; } void Window::EnableThemeSupport (void) { mpWindowImpl->mbIsThemingEnabled = sal_True; } void Window::DisableThemeSupport (void) { mpWindowImpl->mbIsThemingEnabled = sal_False; } ImplBorderWindow* Window::CreateBorderWindow ( Window* pParent, const WinBits nStyle, const sal_uInt16 nTypeStyle) { return new ImplBorderWindow(pParent, nStyle, nTypeStyle); }