blob: f6b04b5d82ee8bf035c8b75805920bda52c88cc7 [file] [log] [blame]
/**************************************************************
*
* 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);
}