|  | /************************************************************** | 
|  | * | 
|  | * 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 <map> | 
|  | #include <vector> | 
|  |  | 
|  | 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<Window*>(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); | 
|  | } |