2004-05-10 14:51:43 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 10:28:00 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2004-05-10 14:51:43 +00:00
|
|
|
*
|
2008-04-11 10:28:00 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2004-05-10 14:51:43 +00:00
|
|
|
*
|
2008-04-11 10:28:00 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2004-05-10 14:51:43 +00:00
|
|
|
*
|
2008-04-11 10:28:00 +00:00
|
|
|
* $RCSfile: window3.cxx,v $
|
|
|
|
* $Revision: 1.13 $
|
2004-05-10 14:51:43 +00:00
|
|
|
*
|
2008-04-11 10:28:00 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2004-05-10 14:51:43 +00:00
|
|
|
*
|
2008-04-11 10:28:00 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2004-05-10 14:51:43 +00:00
|
|
|
*
|
2008-04-11 10:28:00 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2004-05-10 14:51:43 +00:00
|
|
|
*
|
2008-04-11 10:28:00 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2004-05-10 14:51:43 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 11:24:10 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_vcl.hxx"
|
|
|
|
|
2004-05-10 14:51:43 +00:00
|
|
|
#define _SV_WINDOW_CXX
|
|
|
|
|
2008-04-04 10:02:34 +00:00
|
|
|
#include "svsys.h"
|
|
|
|
#include "vcl/window.h"
|
|
|
|
#include "vcl/window.hxx"
|
|
|
|
#include "vcl/waitobj.hxx"
|
|
|
|
#include "vcl/salgdi.hxx"
|
|
|
|
#include "vcl/salnativewidgets.hxx"
|
|
|
|
#include "vcl/salctrlhandle.hxx"
|
|
|
|
#include "rtl/ustring.hxx"
|
|
|
|
#include "vcl/button.hxx"
|
2004-05-10 14:51:43 +00:00
|
|
|
|
|
|
|
using namespace rtl;
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
// These functions are mainly passthrough functions that allow access to
|
|
|
|
// the SalFrame behind a Window object for native widget rendering purposes.
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Window::ImplInitSalControlHandle()
|
|
|
|
{
|
|
|
|
// create SalControlHandle on demand
|
|
|
|
// not needed for ordinary windows
|
|
|
|
// TODO: move creation to SalGraphics
|
|
|
|
//if( !ImplGetWinData()->mpSalControlHandle )
|
|
|
|
// ImplGetWinData()->mpSalControlHandle = new SalControlHandle;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL Window::IsNativeControlSupported( ControlType nType, ControlPart nPart )
|
|
|
|
{
|
|
|
|
if( !IsNativeWidgetEnabled() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if ( !mpGraphics )
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return( mpGraphics->IsNativeControlSupported(nType, nPart) );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL Window::HitTestNativeControl( ControlType nType,
|
|
|
|
ControlPart nPart,
|
|
|
|
const Region& rControlRegion,
|
|
|
|
const Point& aPos,
|
|
|
|
BOOL& rIsInside )
|
|
|
|
{
|
|
|
|
if( !IsNativeWidgetEnabled() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if ( !mpGraphics )
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
ImplInitSalControlHandle();
|
2006-03-22 09:39:33 +00:00
|
|
|
|
|
|
|
Point aWinOffs;
|
|
|
|
aWinOffs = OutputToScreenPixel( aWinOffs );
|
|
|
|
Region screenRegion( rControlRegion );
|
|
|
|
screenRegion.Move( aWinOffs.X(), aWinOffs.Y());
|
|
|
|
|
|
|
|
return( mpGraphics->HitTestNativeControl(nType, nPart, screenRegion, OutputToScreenPixel( aPos ), *ImplGetWinData()->mpSalControlHandle, rIsInside, this ) );
|
2004-05-10 14:51:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2006-06-19 18:43:13 +00:00
|
|
|
void Window::ImplMoveControlValue( ControlType nType, const ImplControlValue& aValue, const Point& rDelta ) const
|
2006-03-22 09:39:33 +00:00
|
|
|
{
|
|
|
|
if( aValue.getOptionalVal() )
|
|
|
|
{
|
|
|
|
switch( nType )
|
|
|
|
{
|
|
|
|
case CTRL_SCROLLBAR:
|
|
|
|
{
|
|
|
|
ScrollbarValue* pScVal = reinterpret_cast<ScrollbarValue*>(aValue.getOptionalVal());
|
|
|
|
pScVal->maThumbRect.Move( rDelta.X(), rDelta.Y() );
|
|
|
|
pScVal->maButton1Rect.Move( rDelta.X(), rDelta.Y() );
|
|
|
|
pScVal->maButton2Rect.Move( rDelta.X(), rDelta.Y() );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case CTRL_SPINBOX:
|
|
|
|
case CTRL_SPINBUTTONS:
|
|
|
|
{
|
|
|
|
SpinbuttonValue* pSpVal = reinterpret_cast<SpinbuttonValue*>(aValue.getOptionalVal());
|
|
|
|
pSpVal->maUpperRect.Move( rDelta.X(), rDelta.Y() );
|
|
|
|
pSpVal->maLowerRect.Move( rDelta.X(), rDelta.Y() );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case CTRL_TOOLBAR:
|
|
|
|
{
|
|
|
|
ToolbarValue* pTVal = reinterpret_cast<ToolbarValue*>(aValue.getOptionalVal());
|
|
|
|
pTVal->maGripRect.Move( rDelta.X(), rDelta.Y() );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-05-10 14:51:43 +00:00
|
|
|
BOOL Window::DrawNativeControl( ControlType nType,
|
|
|
|
ControlPart nPart,
|
|
|
|
const Region& rControlRegion,
|
|
|
|
ControlState nState,
|
|
|
|
const ImplControlValue& aValue,
|
|
|
|
OUString aCaption )
|
|
|
|
{
|
|
|
|
if( !IsNativeWidgetEnabled() )
|
|
|
|
return FALSE;
|
|
|
|
|
2004-11-16 14:12:59 +00:00
|
|
|
/*
|
2004-05-10 14:51:43 +00:00
|
|
|
if( !IsInPaint() && IsPaintTransparent() )
|
|
|
|
{
|
|
|
|
// only required if called directly (ie, we're not in Paint() ):
|
|
|
|
// force redraw (Paint()) for transparent controls
|
|
|
|
// to trigger a repaint of the background
|
|
|
|
Region aClipRgn( GetClipRegion() );
|
|
|
|
if( !rControlRegion.IsEmpty() )
|
|
|
|
aClipRgn.Intersect( rControlRegion );
|
|
|
|
Invalidate( aClipRgn, INVALIDATE_UPDATE );
|
|
|
|
return TRUE;
|
|
|
|
}
|
2004-11-16 14:12:59 +00:00
|
|
|
*/
|
2004-05-10 14:51:43 +00:00
|
|
|
|
|
|
|
ImplInitSalControlHandle();
|
|
|
|
|
|
|
|
// make sure the current clip region is initialized correctly
|
|
|
|
if ( !mpGraphics )
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
if ( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
if ( mbInitFillColor )
|
|
|
|
ImplInitFillColor();
|
|
|
|
|
|
|
|
// Convert the coordinates from relative to Window-absolute, so we draw
|
|
|
|
// in the correct place in platform code
|
|
|
|
Point aWinOffs;
|
|
|
|
aWinOffs = OutputToScreenPixel( aWinOffs );
|
|
|
|
Region screenRegion( rControlRegion );
|
|
|
|
screenRegion.Move( aWinOffs.X(), aWinOffs.Y());
|
|
|
|
|
2006-03-22 09:39:33 +00:00
|
|
|
// do so for ImplControlValue members, also
|
2006-06-19 18:43:13 +00:00
|
|
|
ImplMoveControlValue( nType, aValue, aWinOffs );
|
2006-03-22 09:39:33 +00:00
|
|
|
|
2004-05-10 14:51:43 +00:00
|
|
|
Region aTestRegion( GetActiveClipRegion() );
|
|
|
|
aTestRegion.Intersect( rControlRegion );
|
|
|
|
if( aTestRegion == rControlRegion )
|
|
|
|
nState |= CTRL_CACHING_ALLOWED; // control is not clipped, caching allowed
|
|
|
|
|
2006-03-22 09:39:33 +00:00
|
|
|
BOOL bRet = mpGraphics->DrawNativeControl(nType, nPart, screenRegion, nState, aValue, *ImplGetWinData()->mpSalControlHandle, aCaption, this );
|
|
|
|
|
|
|
|
// transform back ImplControlValue members
|
2006-06-19 18:43:13 +00:00
|
|
|
ImplMoveControlValue( nType, aValue, Point()-aWinOffs );
|
2006-03-22 09:39:33 +00:00
|
|
|
|
|
|
|
return bRet;
|
2004-05-10 14:51:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL Window::DrawNativeControlText(ControlType nType,
|
|
|
|
ControlPart nPart,
|
|
|
|
const Region& rControlRegion,
|
|
|
|
ControlState nState,
|
|
|
|
const ImplControlValue& aValue,
|
|
|
|
OUString aCaption )
|
|
|
|
{
|
|
|
|
if( !IsNativeWidgetEnabled() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
ImplInitSalControlHandle();
|
|
|
|
|
|
|
|
// make sure the current clip region is initialized correctly
|
|
|
|
if ( !mpGraphics )
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if ( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
if ( mbInitFillColor )
|
|
|
|
ImplInitFillColor();
|
|
|
|
|
|
|
|
// Convert the coordinates from relative to Window-absolute, so we draw
|
|
|
|
// in the correct place in platform code
|
|
|
|
Point aWinOffs;
|
|
|
|
aWinOffs = OutputToScreenPixel( aWinOffs );
|
|
|
|
Region screenRegion( rControlRegion );
|
|
|
|
screenRegion.Move( aWinOffs.X(), aWinOffs.Y());
|
2006-06-19 18:43:13 +00:00
|
|
|
ImplMoveControlValue( nType, aValue, aWinOffs );
|
2004-05-10 14:51:43 +00:00
|
|
|
|
2006-03-22 09:39:33 +00:00
|
|
|
BOOL bRet = mpGraphics->DrawNativeControlText(nType, nPart, screenRegion, nState, aValue, *ImplGetWinData()->mpSalControlHandle, aCaption, this );
|
|
|
|
|
|
|
|
// transform back ImplControlValue members
|
2006-06-19 18:43:13 +00:00
|
|
|
ImplMoveControlValue( nType, aValue, Point()-aWinOffs );
|
2006-03-22 09:39:33 +00:00
|
|
|
|
|
|
|
return bRet;
|
2004-05-10 14:51:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL Window::GetNativeControlRegion( ControlType nType,
|
|
|
|
ControlPart nPart,
|
|
|
|
const Region& rControlRegion,
|
|
|
|
ControlState nState,
|
|
|
|
const ImplControlValue& aValue,
|
|
|
|
OUString aCaption,
|
|
|
|
Region &rNativeBoundingRegion,
|
|
|
|
Region &rNativeContentRegion )
|
|
|
|
{
|
|
|
|
if( !IsNativeWidgetEnabled() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if ( !mpGraphics )
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
ImplInitSalControlHandle();
|
2006-03-22 09:39:33 +00:00
|
|
|
|
|
|
|
// Convert the coordinates from relative to Window-absolute, so we draw
|
|
|
|
// in the correct place in platform code
|
|
|
|
Point aWinOffs;
|
|
|
|
aWinOffs = OutputToScreenPixel( aWinOffs );
|
|
|
|
Region screenRegion( rControlRegion );
|
|
|
|
screenRegion.Move( aWinOffs.X(), aWinOffs.Y());
|
2006-06-19 18:43:13 +00:00
|
|
|
ImplMoveControlValue( nType, aValue, aWinOffs );
|
2006-03-22 09:39:33 +00:00
|
|
|
|
|
|
|
BOOL bRet = mpGraphics->GetNativeControlRegion(nType, nPart, screenRegion, nState, aValue,
|
2004-05-10 14:51:43 +00:00
|
|
|
*ImplGetWinData()->mpSalControlHandle, aCaption, rNativeBoundingRegion,
|
2006-03-22 09:39:33 +00:00
|
|
|
rNativeContentRegion, this );
|
|
|
|
if( bRet )
|
|
|
|
{
|
|
|
|
// transform back native regions
|
|
|
|
rNativeBoundingRegion.Move( -aWinOffs.X(), -aWinOffs.Y() );
|
|
|
|
rNativeContentRegion.Move( -aWinOffs.X(), -aWinOffs.Y() );
|
|
|
|
}
|
|
|
|
// transform back ImplControlValue members
|
2006-06-19 18:43:13 +00:00
|
|
|
ImplMoveControlValue( nType, aValue, Point()-aWinOffs );
|
2006-03-22 09:39:33 +00:00
|
|
|
|
|
|
|
return bRet;
|
2004-05-10 14:51:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
2005-01-13 17:06:55 +00:00
|
|
|
|
|
|
|
WaitObject::~WaitObject()
|
|
|
|
{
|
|
|
|
if ( mpWindow )
|
|
|
|
mpWindow->LeaveWait();
|
|
|
|
}
|
2008-01-14 12:06:28 +00:00
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Size Window::GetOptimalSize(WindowSizeType eType) const
|
|
|
|
{
|
|
|
|
switch (eType) {
|
|
|
|
case WINDOWSIZE_MINIMUM:
|
|
|
|
return Size();
|
|
|
|
case WINDOWSIZE_PREFERRED:
|
|
|
|
return GetOptimalSize( WINDOWSIZE_MINIMUM );
|
|
|
|
case WINDOWSIZE_MAXIMUM:
|
|
|
|
default:
|
|
|
|
return Size( LONG_MAX, LONG_MAX );
|
|
|
|
}
|
|
|
|
}
|
2008-04-04 10:02:34 +00:00
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Window::ImplAdjustNWFSizes()
|
|
|
|
{
|
|
|
|
switch( GetType() )
|
|
|
|
{
|
|
|
|
case WINDOW_CHECKBOX:
|
|
|
|
((CheckBox*)this)->ImplSetMinimumNWFSize();
|
|
|
|
break;
|
|
|
|
case WINDOW_RADIOBUTTON:
|
|
|
|
((RadioButton*)this)->ImplSetMinimumNWFSize();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
// iterate over children
|
|
|
|
Window* pWin = GetWindow( WINDOW_FIRSTCHILD );
|
|
|
|
while( pWin )
|
|
|
|
{
|
|
|
|
pWin->ImplAdjustNWFSizes();
|
|
|
|
pWin = pWin->GetWindow( WINDOW_NEXT );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|