blob: e648794a058f6bfc8145a838ef8f5a8aca63c0fc [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 "vclxdialog.hxx"
#include <com/sun/star/awt/PosSize.hpp>
#include <com/sun/star/awt/SystemDependentXWindow.hpp>
#include <com/sun/star/lang/SystemDependent.hpp>
#include <cppuhelper/typeprovider.hxx>
#include <toolkit/awt/vclxmenu.hxx>
#include <toolkit/helper/macros.hxx>
#include <toolkit/helper/property.hxx>
#ifdef WNT
#include <tools/prewin.h>
#include <windows.h>
#include <tools/postwin.h>
#elif defined ( OS2 )
#include <svpm.h>
#elif defined ( QUARTZ )
#include "premac.h"
#include <Cocoa/Cocoa.h>
#include "postmac.h"
#endif
#include <vcl/dialog.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/svapp.hxx>
#include <vcl/sysdata.hxx>
#include <vcl/wrkwin.hxx>
#include "forward.hxx"
namespace layoutimpl
{
DBG_NAME( VCLXDialog )
VCLXDialog::VCLXDialog()
: VCLXWindow()
, VCLXTopWindow_Base( true )
, VCLXDialog_Base()
, Bin()
, bRealized( false )
, bResizeSafeguard( false )
{
DBG_CTOR( VCLXDialog, NULL );
/* mxLayoutUnit = uno::Reference< awt::XLayoutUnit >( new LayoutUnit() );
assert(mxLayoutUnit.is());*/
}
VCLXDialog::~VCLXDialog()
{
DBG_DTOR( VCLXDialog, NULL );
}
vos::IMutex& VCLXDialog::GetMutexImpl()
{
return VCLXWindow::GetMutex();
}
Window* VCLXDialog::GetWindowImpl()
{
return VCLXWindow::GetWindow();
}
::cppu::OInterfaceContainerHelper& VCLXDialog::GetTopWindowListenersImpl()
{
return GetTopWindowListeners();
}
IMPLEMENT_2_FORWARD_XINTERFACE2( VCLXDialog, VCLXWindow, Bin, VCLXDialog_Base );
IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXDialog, VCLXWindow, VCLXDialog_Base );
void SAL_CALL VCLXDialog::dispose() throw(::com::sun::star::uno::RuntimeException)
{
{
::vos::OGuard aGuard( GetMutex() );
::com::sun::star::lang::EventObject aDisposeEvent;
aDisposeEvent.Source = W3K_EXPLICIT_CAST (*this);
// maTabListeners.disposeAndClear( aDisposeEvent );
}
VCLXWindow::dispose();
}
void VCLXDialog::resizedCb()
{
queueResize();
}
void SAL_CALL VCLXDialog::allocateArea( const css::awt::Rectangle &rArea )
throw (css::uno::RuntimeException)
{
::com::sun::star::awt::Size reqSize = Bin::getMinimumSize();
reqSize.Height = getHeightForWidth( rArea.Width );
if ( !bRealized )
{
setPosSize( 0, 0, reqSize.Width, reqSize.Height, ::com::sun::star::awt::PosSize::SIZE );
bRealized = true;
setVisible( true );
}
else
{
::com::sun::star::awt::Size curSize = getSize();
if ( reqSize.Width > curSize.Width )
setPosSize( 0, 0, reqSize.Width, 0, ::com::sun::star::awt::PosSize::WIDTH );
if ( reqSize.Height > curSize.Height )
setPosSize( 0, 0, 0, reqSize.Height, ::com::sun::star::awt::PosSize::HEIGHT );
}
::com::sun::star::awt::Size size = getSize();
maAllocation.Width = size.Width;
maAllocation.Height = size.Height;
Bin::allocateArea( maAllocation );
}
void VCLXDialog::ProcessWindowEvent( const VclWindowEvent& _rVclWindowEvent )
{
::vos::OClearableGuard aGuard( GetMutex() );
switch ( _rVclWindowEvent.GetId() )
{
case VCLEVENT_WINDOW_RESIZE:
resizedCb();
default:
aGuard.clear();
VCLXWindow::ProcessWindowEvent( _rVclWindowEvent );
break;
}
}
void SAL_CALL VCLXDialog::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any &Value ) throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
if ( GetWindow() )
{
/* sal_uInt16 nPropertyId = GetPropertyId( PropertyName );
switch ( nPropertyId )
{
default:
*/
VCLXWindow::setProperty( PropertyName, Value );
/* }
*/
}
}
::com::sun::star::uno::Any SAL_CALL VCLXDialog::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
::com::sun::star::uno::Any aReturn;
if ( GetWindow() )
{
/*
sal_uInt16 nPropertyId = GetPropertyId( PropertyName );
switch ( nPropertyId )
{
default:
*/
aReturn = VCLXWindow::getProperty( PropertyName );
/*
}
*/
}
return aReturn;
}
void VCLXDialog::setTitle( const ::rtl::OUString& Title ) throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
Window* pWindow = GetWindow();
if ( pWindow )
pWindow->SetText( Title );
}
void VCLXDialog::setHelpId( const rtl::OUString& rId ) throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
Window* pWindow = GetWindow();
if ( pWindow )
pWindow->SetHelpId( rtl::OUStringToOString( rId, RTL_TEXTENCODING_UTF8 ) );
}
::rtl::OUString VCLXDialog::getTitle() throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
::rtl::OUString aTitle;
Window* pWindow = GetWindow();
if ( pWindow )
aTitle = pWindow->GetText();
return aTitle;
}
sal_Int16 VCLXDialog::execute() throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
sal_Int16 nRet = 0;
if ( GetWindow() )
{
Dialog* pDlg = (Dialog*) GetWindow();
Window* pParent = pDlg->GetWindow( WINDOW_PARENTOVERLAP );
Window* pOldParent = NULL;
if ( pParent && !pParent->IsReallyVisible() )
{
pOldParent = pDlg->GetParent();
Window* pFrame = pDlg->GetWindow( WINDOW_FRAME );
if ( pFrame != pDlg )
pDlg->SetParent( pFrame );
}
nRet = pDlg->Execute();
if ( pOldParent )
pDlg->SetParent( pOldParent );
}
return nRet;
}
void VCLXDialog::endDialog( sal_Int32 nResult ) throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
if ( nResult == BUTTONID_HELP )
{
// UGH: c&p button.cxx
::Window* pFocusWin = Application::GetFocusWindow();
if ( !pFocusWin )
pFocusWin = GetWindow();
HelpEvent aEvt( pFocusWin->GetPointerPosPixel(), HELPMODE_CONTEXT );
pFocusWin->RequestHelp( aEvt );
return;
}
Dialog* pDlg = (Dialog*) GetWindow();
if ( pDlg )
pDlg->EndDialog( nResult );
}
void VCLXDialog::endExecute() throw(::com::sun::star::uno::RuntimeException)
{
endDialog( 0 );
}
} // namespace layoutimpl