Files
libreoffice/toolkit/source/awt/vclxdialog.cxx

346 lines
9.8 KiB
C++
Raw Normal View History

#include "vclxdialog.hxx"
#include "toolkit/helper/property.hxx"
#include <com/sun/star/awt/ScrollBarOrientation.hpp>
#include <tools/debug.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/wrkwin.hxx>
#include <vcl/syswin.hxx>
#include <vcl/menu.hxx>
#include <vcl/dialog.hxx>
#include <vcl/svapp.hxx>
#include <vcl/syschild.hxx>
#include <vcl/sysdata.hxx>
#include <cppuhelper/typeprovider.hxx>
#include <toolkit/awt/vclxmenu.hxx>
#include <toolkit/helper/macros.hxx>
#include <com/sun/star/lang/SystemDependent.hpp>
#include <com/sun/star/awt/SystemDependentXWindow.hpp>
#include <toolkit/helper/vclunohelper.hxx>
#include <com/sun/star/awt/PosSize.hpp>
#include "../layout/timer.hxx"
using namespace toolkit;
//........................................................................
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;
//====================================================================
//= VCLXDialog
//====================================================================
DBG_NAME( VCLXDialog )
//--------------------------------------------------------------------
VCLXDialog::VCLXDialog()
: VCLXWindow()
, 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 );
}
//--------------------------------------------------------------------
IMPLEMENT_2_FORWARD_XINTERFACE2( VCLXDialog, VCLXWindow, Bin, VCLXDialog_Base )
//--------------------------------------------------------------------
IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXDialog, VCLXWindow, VCLXDialog_Base )
//--------------------------------------------------------------------
void SAL_CALL VCLXDialog::dispose( ) throw(RuntimeException)
{
{
::vos::OGuard aGuard( GetMutex() );
EventObject aDisposeEvent;
aDisposeEvent.Source = *this;
// maTabListeners.disposeAndClear( aDisposeEvent );
}
VCLXWindow::dispose();
}
void VCLXDialog::resizedCb()
{
queueResize();
}
void SAL_CALL VCLXDialog::allocateArea( const css::awt::Rectangle &rArea )
throw (css::uno::RuntimeException)
{
awt::Size reqSize = Bin::getMinimumSize();
reqSize.Height = getHeightForWidth( rArea.Width );
if ( !bRealized )
{
setPosSize( 0, 0, reqSize.Width, reqSize.Height, PosSize::SIZE );
bRealized = true;
setVisible( true );
}
else
{
awt::Size curSize = getSize();
if ( reqSize.Width > curSize.Width )
setPosSize( 0, 0, reqSize.Width, 0, PosSize::WIDTH );
if ( reqSize.Height > curSize.Height )
setPosSize( 0, 0, 0, reqSize.Height, PosSize::HEIGHT );
}
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 Any &Value ) throw(RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
if ( GetWindow() )
{
sal_uInt16 nPropertyId = GetPropertyId( PropertyName );
switch ( nPropertyId )
{
default:
VCLXWindow::setProperty( PropertyName, Value );
}
}
}
//--------------------------------------------------------------------
Any SAL_CALL VCLXDialog::getProperty( const ::rtl::OUString& PropertyName ) throw(RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
Any aReturn;
if ( GetWindow() )
{
sal_uInt16 nPropertyId = GetPropertyId( PropertyName );
switch ( nPropertyId )
{
default:
aReturn = VCLXWindow::getProperty( PropertyName );
}
}
return aReturn;
}
//---------------------------------------------------------------------
::com::sun::star::uno::Any VCLXDialog::getWindowHandle( const ::com::sun::star::uno::Sequence< sal_Int8 >& /*ProcessId*/, sal_Int16 SystemType ) throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
::com::sun::star::uno::Any aRet;
Window* pWindow = VCLXWindow::GetWindow();
if ( pWindow )
{
const SystemEnvData* pSysData = ((SystemWindow *)pWindow)->GetSystemData();
if ( pSysData )
{
#if (defined WNT)
if ( SystemType == ::com::sun::star::lang::SystemDependent::SYSTEM_WIN32 )
{
aRet <<= (sal_Int32)pSysData->hWnd;
}
#elif (defined OS2)
if ( SystemType == ::com::sun::star::lang::SystemDependent::SYSTEM_OS2 )
{
aRet <<= (sal_Int32)pSysData->hWnd;
}
#elif (defined QUARTZ)
if ( SystemType == ::com::sun::star::lang::SystemDependent::SYSTEM_MAC )
{
aRet <<= (sal_IntPtr)pSysData->rWindow;
}
#elif (defined UNX)
if ( SystemType == ::com::sun::star::lang::SystemDependent::SYSTEM_XWINDOW )
{
::com::sun::star::awt::SystemDependentXWindow aSD;
aSD.DisplayPointer = sal::static_int_cast< sal_Int64 >(reinterpret_cast< sal_IntPtr >(pSysData->pDisplay));
aSD.WindowHandle = pSysData->aWindow;
aRet <<= aSD;
}
#endif
}
}
return aRet;
}
void VCLXDialog::addTopWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTopWindowListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException)
{
#if 1
::vos::OGuard aGuard( GetMutex() );
GetTopWindowListeners().addInterface( rxListener );
#else
#endif
}
void VCLXDialog::removeTopWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTopWindowListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException)
{
#if 1
::vos::OGuard aGuard( GetMutex() );
GetTopWindowListeners().removeInterface( rxListener );
#endif
}
void VCLXDialog::toFront( ) throw(::com::sun::star::uno::RuntimeException)
{
::vos::OGuard aGuard( GetMutex() );
Window* pWindow = GetWindow();
if ( pWindow )
((WorkWindow*)pWindow)->ToTop( TOTOP_RESTOREWHENMIN );
}
void VCLXDialog::toBack( ) throw(::com::sun::star::uno::RuntimeException)
{
/* Not possible in VCL...
::vos::OGuard aGuard( GetMutex() );
Window* pWindow = GetWindow();
if ( pWindow )
{
((WorkWindow*)pWindow)->ToBack();
}
*/
}
void VCLXDialog::setMenuBar( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMenuBar >& /*rxMenu*/ ) throw(::com::sun::star::uno::RuntimeException)
{
#if 0
::vos::OGuard aGuard( GetMutex() );
SystemWindow* pWindow = (SystemWindow*) GetWindow();
if ( pWindow )
{
pWindow->SetMenuBar( NULL );
if ( rxMenu.is() )
{
VCLXMenu* pMenu = VCLXMenu::GetImplementation( rxMenu );
if ( pMenu && !pMenu->IsPopupMenu() )
pWindow->SetMenuBar( (MenuBar*) pMenu->GetMenu() );
}
}
mxMenuBar = rxMenu;
#endif
}
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 );
}
::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 toolkit
//........................................................................