[Libreoffice-commits] core.git: 8 commits - include/vcl vcl/Library_vcl.mk vcl/source
Chris Sherlock
chris.sherlock79 at gmail.com
Fri May 23 06:05:09 PDT 2014
include/vcl/window.hxx | 4
vcl/Library_vcl.mk | 1
vcl/source/window/clipping.cxx | 174 ++++
vcl/source/window/mouse.cxx | 6
vcl/source/window/stacking.cxx | 2
vcl/source/window/window.cxx | 1587 +----------------------------------------
6 files changed, 226 insertions(+), 1548 deletions(-)
New commits:
commit 66fc6d223fd086b7611eb8bf3111a55e858bade0
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 22:57:10 2014 +1000
vcl: change to sal_True and sal_False in comments in window.cxx
Change-Id: Ie42eb45e05a928a59b51e0546e212dc938967eb4
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 630b8ad..513eb6f 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -675,13 +675,13 @@ WindowImpl::WindowImpl( WindowType nType )
mbMenuFloatingWindow= false; // true: MenuFloatingWindow is the base class
mbToolbarFloatingWindow= false; // true: ImplPopupFloatWin is the base class, used for subtoolbars
mbSplitter = false; // true: Splitter is the base class
- mbVisible = false; // true: Show( sal_True ) called
+ mbVisible = false; // true: Show( true ) called
mbOverlapVisible = false; // true: Hide called for visible window from ImplHideAllOverlapWindow()
- mbDisabled = false; // true: Enable( sal_False ) called
- mbInputDisabled = false; // true: EnableInput( sal_False ) called
+ mbDisabled = false; // true: Enable( false ) called
+ mbInputDisabled = false; // true: EnableInput( false ) called
mbDropDisabled = false; // true: Drop is enabled
- mbNoUpdate = false; // true: SetUpdateMode( sal_False ) called
- mbNoParentUpdate = false; // true: SetParentUpdateMode( sal_False ) called
+ mbNoUpdate = false; // true: SetUpdateMode( false ) called
+ mbNoParentUpdate = false; // true: SetParentUpdateMode( false ) called
mbActive = false; // true: Window Active
mbParentActive = false; // true: OverlapActive from Parent
mbReallyVisible = false; // true: this and all parents to an overlapped window are visible
@@ -689,7 +689,7 @@ WindowImpl::WindowImpl( WindowType nType )
mbInInitShow = false; // true: we are in InitShow
mbChildNotify = false; // true: ChildNotify
mbChildPtrOverwrite = false; // true: PointerStyle overwrites Child-Pointer
- mbNoPtrVisible = false; // true: ShowPointer( sal_False ) called
+ mbNoPtrVisible = false; // true: ShowPointer( false ) called
mbMouseMove = false; // true: BaseMouseMove called
mbPaintFrame = false; // true: Paint is visible, but not painted
mbInPaint = false; // true: Inside PaintHdl
commit f2ce0d9a71efc607d30a324a8a4a303b5ad7bfd4
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 22:55:12 2014 +1000
vcl: change to true and false in Window::ImplGetCanvas()
Change-Id: I0cf18a87f85c62d3f8b92af8f1ccda3d2b2f93f1
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index bf4112c..630b8ad 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -4381,7 +4381,7 @@ uno::Reference< rendering::XCanvas > Window::ImplGetCanvas( const Size& rFullscr
else
aArg[ 2 ] = makeAny( ::com::sun::star::awt::Rectangle( mnOutOffX, mnOutOffY, mnOutWidth, mnOutHeight ) );
- aArg[ 3 ] = makeAny( mpWindowImpl->mbAlwaysOnTop ? sal_True : sal_False );
+ aArg[ 3 ] = makeAny( mpWindowImpl->mbAlwaysOnTop ? true : false );
aArg[ 4 ] = makeAny( uno::Reference< awt::XWindow >(
const_cast<Window*>(this)->GetComponentInterface(),
uno::UNO_QUERY ));
commit 58021e8866e6a539bb915742067b3674e0c93b92
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 22:54:16 2014 +1000
vcl: change to true and false in Window::SetCallHandlersOnInputDisabled()
Change-Id: Id6af99e1dfbf6bce68794027700eb500b7f3a8dc
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index c238563..bf4112c 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -2985,7 +2985,7 @@ void Window::Enable( bool bEnable, bool bChild )
void Window::SetCallHandlersOnInputDisabled( bool bCall )
{
- mpWindowImpl->mbCallHandlersDuringInputDisabled = bCall ? sal_True : sal_False;
+ mpWindowImpl->mbCallHandlersDuringInputDisabled = bCall ? true : false;
Window* pChild = mpWindowImpl->mpFirstChild;
while ( pChild )
commit fd95975a469f283dd0bc154caf62cc467aed38d6
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 22:52:43 2014 +1000
vcl: change to true and false in Window::Show()
Change-Id: I299dcb649d40514c16e41b138def0ad67894cd6d
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 53531bd..c238563 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1328,7 +1328,7 @@ ImplWinData* Window::ImplGetWinData() const
mpWindowImpl->mpWinData->mnTrackFlags = 0;
mpWindowImpl->mpWinData->mnIsTopWindow = (sal_uInt16) ~0; // not initialized yet, 0/1 will indicate TopWindow (see IsTopWindow())
mpWindowImpl->mpWinData->mbMouseOver = false;
- mpWindowImpl->mpWinData->mbEnableNativeWidget = (pNoNWF && *pNoNWF) ? false : true; // sal_True: try to draw this control with native theme API
+ mpWindowImpl->mpWinData->mbEnableNativeWidget = (pNoNWF && *pNoNWF) ? false : true; // true: try to draw this control with native theme API
}
return mpWindowImpl->mpWinData;
@@ -2822,7 +2822,7 @@ void Window::Show( bool bVisible, sal_uInt16 nFlags )
mpWindowImpl->mbSuppressAccessibilityEvents = false;
mpWindowImpl->mbPaintFrame = true;
- bool bNoActivate = (nFlags & (SHOW_NOACTIVATE|SHOW_NOFOCUSCHANGE)) ? sal_True : sal_False;
+ bool bNoActivate = (nFlags & (SHOW_NOACTIVATE|SHOW_NOFOCUSCHANGE)) ? true : false;
mpWindowImpl->mpFrame->Show( true, bNoActivate );
if( aDogTag.IsDead() )
return;
commit 23eb4435edf8d0634cc253588bb0184db8875301
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 22:48:14 2014 +1000
vcl: change to true and false in Window::ImplTestMousePointerSet()
Change-Id: I5184b9bf7d080f65a702a88214906264b9d88e2f
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 379dbd4..ddf010d 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -503,7 +503,7 @@ private:
SAL_DLLPRIVATE bool ImplIsRealParentPath( const Window* pWindow ) const;
- SAL_DLLPRIVATE int ImplTestMousePointerSet();
+ SAL_DLLPRIVATE bool ImplTestMousePointerSet();
SAL_DLLPRIVATE void ImplResetReallyVisible();
SAL_DLLPRIVATE void ImplSetReallyVisible();
diff --git a/vcl/source/window/mouse.cxx b/vcl/source/window/mouse.cxx
index e4503bb..2005fcc 100644
--- a/vcl/source/window/mouse.cxx
+++ b/vcl/source/window/mouse.cxx
@@ -74,7 +74,7 @@ sal_uInt16 Window::ImplHitTest( const Point& rFramePos )
return nHitTest;
}
-int Window::ImplTestMousePointerSet()
+bool Window::ImplTestMousePointerSet()
{
// as soon as mouse is captured, switch mouse-pointer
if ( IsMouseCaptured() )
@@ -83,9 +83,9 @@ int Window::ImplTestMousePointerSet()
// if the mouse is over the window, switch it
Rectangle aClientRect( Point( 0, 0 ), GetOutputSizePixel() );
if ( aClientRect.IsInside( GetPointerPosPixel() ) )
- return sal_True;
+ return true;
- return sal_False;
+ return false;
}
PointerStyle Window::ImplGetMousePointer() const
commit ec1d05d9fbf184418ffb2250233e16e5255ac18f
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 22:46:13 2014 +1000
vcl: change to true and false in Window::ImplGetWinData()
Change-Id: I7e4c664bf867b43f121b6c37bfe8e470cab2cfd3
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 85cb449..53531bd 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1328,7 +1328,7 @@ ImplWinData* Window::ImplGetWinData() const
mpWindowImpl->mpWinData->mnTrackFlags = 0;
mpWindowImpl->mpWinData->mnIsTopWindow = (sal_uInt16) ~0; // not initialized yet, 0/1 will indicate TopWindow (see IsTopWindow())
mpWindowImpl->mpWinData->mbMouseOver = false;
- mpWindowImpl->mpWinData->mbEnableNativeWidget = (pNoNWF && *pNoNWF) ? sal_False : sal_True; // sal_True: try to draw this control with native theme API
+ mpWindowImpl->mpWinData->mbEnableNativeWidget = (pNoNWF && *pNoNWF) ? false : true; // sal_True: try to draw this control with native theme API
}
return mpWindowImpl->mpWinData;
commit c72635e02088390435ef995bf218665133a2655d
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 22:44:17 2014 +1000
vcl: change to true and false in Window::IsTopWindow()
Change-Id: Id8ef10950ea5034cf5a7e497843fe996a2c322f2
diff --git a/vcl/source/window/stacking.cxx b/vcl/source/window/stacking.cxx
index ef1d8b7..f48d9ed 100644
--- a/vcl/source/window/stacking.cxx
+++ b/vcl/source/window/stacking.cxx
@@ -701,7 +701,7 @@ bool Window::IsTopWindow() const
uno::Reference< XTopWindow > xTopWindow( pThisWin->GetComponentInterface(), UNO_QUERY );
pThisWin->mpWindowImpl->mpWinData->mnIsTopWindow = xTopWindow.is() ? 1 : 0;
}
- return mpWindowImpl->mpWinData->mnIsTopWindow == 1 ? sal_True : sal_False;
+ return mpWindowImpl->mpWinData->mnIsTopWindow == 1 ? true : false;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 657481f2ff269b47a749394f4d012684154cbf16
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 22:41:19 2014 +1000
vcl: moved paint functions from window.cxx to paint.cxx
Change-Id: Ie039c971d9d015e20d814fdda67bd489e6aa7501
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 4576bdb..379dbd4 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -314,6 +314,8 @@ typedef sal_uInt16 StateChangedType;
const char* ImplDbgCheckWindow( const void* pObj );
#endif
+bool ImplDoTiledRendering();
+
class Dialog;
class WindowImpl;
class PaintHelper;
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index 3bf8648..a1f2432 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -102,6 +102,7 @@ $(eval $(call gb_Library_use_externals,vcl,\
$(eval $(call gb_Library_add_exception_objects,vcl,\
vcl/source/window/settings \
+ vcl/source/window/paint \
vcl/source/window/resource \
vcl/source/window/abstdlg \
vcl/source/window/accel \
diff --git a/vcl/source/window/clipping.cxx b/vcl/source/window/clipping.cxx
index 94b510d..96ad882 100644
--- a/vcl/source/window/clipping.cxx
+++ b/vcl/source/window/clipping.cxx
@@ -635,5 +635,179 @@ void Window::ImplIntersectWindowClipRegion( Region& rRegion )
rRegion.Intersect( mpWindowImpl->maWinClipRegion );
}
+void Window::ImplIntersectWindowRegion( Region& rRegion )
+{
+ rRegion.Intersect( Rectangle( Point( mnOutOffX, mnOutOffY ),
+ Size( mnOutWidth, mnOutHeight ) ) );
+ if ( mpWindowImpl->mbWinRegion )
+ rRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
+}
+
+void Window::ImplExcludeWindowRegion( Region& rRegion )
+{
+ if ( mpWindowImpl->mbWinRegion )
+ {
+ Point aPoint( mnOutOffX, mnOutOffY );
+ Region aRegion( Rectangle( aPoint,
+ Size( mnOutWidth, mnOutHeight ) ) );
+ aRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
+ rRegion.Exclude( aRegion );
+ }
+ else
+ {
+ Point aPoint( mnOutOffX, mnOutOffY );
+ rRegion.Exclude( Rectangle( aPoint,
+ Size( mnOutWidth, mnOutHeight ) ) );
+ }
+}
+
+void Window::ImplExcludeOverlapWindows( Region& rRegion )
+{
+ Window* pWindow = mpWindowImpl->mpFirstOverlap;
+ while ( pWindow )
+ {
+ if ( pWindow->mpWindowImpl->mbReallyVisible )
+ {
+ pWindow->ImplExcludeWindowRegion( rRegion );
+ pWindow->ImplExcludeOverlapWindows( rRegion );
+ }
+
+ pWindow = pWindow->mpWindowImpl->mpNext;
+ }
+}
+
+void Window::ImplExcludeOverlapWindows2( Region& rRegion )
+{
+ if ( mpWindowImpl->mbReallyVisible )
+ ImplExcludeWindowRegion( rRegion );
+
+ ImplExcludeOverlapWindows( rRegion );
+}
+
+void Window::ImplIntersectAndUnionOverlapWindows( const Region& rInterRegion, Region& rRegion )
+{
+ Window* pWindow = mpWindowImpl->mpFirstOverlap;
+ while ( pWindow )
+ {
+ if ( pWindow->mpWindowImpl->mbReallyVisible )
+ {
+ Region aTempRegion( rInterRegion );
+ pWindow->ImplIntersectWindowRegion( aTempRegion );
+ rRegion.Union( aTempRegion );
+ pWindow->ImplIntersectAndUnionOverlapWindows( rInterRegion, rRegion );
+ }
+
+ pWindow = pWindow->mpWindowImpl->mpNext;
+ }
+}
+
+void Window::ImplIntersectAndUnionOverlapWindows2( const Region& rInterRegion, Region& rRegion )
+{
+ if ( mpWindowImpl->mbReallyVisible )
+ {
+ Region aTempRegion( rInterRegion );
+ ImplIntersectWindowRegion( aTempRegion );
+ rRegion.Union( aTempRegion );
+ }
+
+ ImplIntersectAndUnionOverlapWindows( rInterRegion, rRegion );
+}
+
+void Window::ImplCalcOverlapRegionOverlaps( const Region& rInterRegion, Region& rRegion )
+{
+ // Clip Overlap Siblings
+ Window* pStartOverlapWindow;
+ if ( !ImplIsOverlapWindow() )
+ pStartOverlapWindow = mpWindowImpl->mpOverlapWindow;
+ else
+ pStartOverlapWindow = this;
+ while ( !pStartOverlapWindow->mpWindowImpl->mbFrame )
+ {
+ Window* pOverlapWindow = pStartOverlapWindow->mpWindowImpl->mpOverlapWindow->mpWindowImpl->mpFirstOverlap;
+ while ( pOverlapWindow && (pOverlapWindow != pStartOverlapWindow) )
+ {
+ pOverlapWindow->ImplIntersectAndUnionOverlapWindows2( rInterRegion, rRegion );
+ pOverlapWindow = pOverlapWindow->mpWindowImpl->mpNext;
+ }
+ pStartOverlapWindow = pStartOverlapWindow->mpWindowImpl->mpOverlapWindow;
+ }
+
+ // Clip Child Overlap Windows
+ if ( !ImplIsOverlapWindow() )
+ mpWindowImpl->mpOverlapWindow->ImplIntersectAndUnionOverlapWindows( rInterRegion, rRegion );
+ else
+ ImplIntersectAndUnionOverlapWindows( rInterRegion, rRegion );
+}
+
+void Window::ImplCalcOverlapRegion( const Rectangle& rSourceRect, Region& rRegion,
+ bool bChildren, bool bParent, bool bSiblings )
+{
+ Region aRegion( rSourceRect );
+ if ( mpWindowImpl->mbWinRegion )
+ rRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
+ Region aTempRegion;
+ Window* pWindow;
+
+ ImplCalcOverlapRegionOverlaps( aRegion, rRegion );
+
+ // Parent-Boundaries
+ if ( bParent )
+ {
+ pWindow = this;
+ if ( !ImplIsOverlapWindow() )
+ {
+ pWindow = ImplGetParent();
+ do
+ {
+ aTempRegion = aRegion;
+ pWindow->ImplExcludeWindowRegion( aTempRegion );
+ rRegion.Union( aTempRegion );
+ if ( pWindow->ImplIsOverlapWindow() )
+ break;
+ pWindow = pWindow->ImplGetParent();
+ }
+ while ( pWindow );
+ }
+ if ( pWindow && !pWindow->mpWindowImpl->mbFrame )
+ {
+ aTempRegion = aRegion;
+ aTempRegion.Exclude( Rectangle( Point( 0, 0 ), Size( mpWindowImpl->mpFrameWindow->mnOutWidth, mpWindowImpl->mpFrameWindow->mnOutHeight ) ) );
+ rRegion.Union( aTempRegion );
+ }
+ }
+
+ // Siblings
+ if ( bSiblings && !ImplIsOverlapWindow() )
+ {
+ pWindow = mpWindowImpl->mpParent->mpWindowImpl->mpFirstChild;
+ do
+ {
+ if ( pWindow->mpWindowImpl->mbReallyVisible && (pWindow != this) )
+ {
+ aTempRegion = aRegion;
+ pWindow->ImplIntersectWindowRegion( aTempRegion );
+ rRegion.Union( aTempRegion );
+ }
+ pWindow = pWindow->mpWindowImpl->mpNext;
+ }
+ while ( pWindow );
+ }
+
+ if ( bChildren )
+ {
+ pWindow = mpWindowImpl->mpFirstChild;
+ while ( pWindow )
+ {
+ if ( pWindow->mpWindowImpl->mbReallyVisible )
+ {
+ aTempRegion = aRegion;
+ pWindow->ImplIntersectWindowRegion( aTempRegion );
+ rRegion.Union( aTempRegion );
+ }
+ pWindow = pWindow->mpWindowImpl->mpNext;
+ }
+ }
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 01b4ee8..85cb449 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -108,13 +108,6 @@ using namespace com::sun;
using ::com::sun::star::awt::XTopWindow;
-#define IMPL_PAINT_PAINT ((sal_uInt16)0x0001)
-#define IMPL_PAINT_PAINTALL ((sal_uInt16)0x0002)
-#define IMPL_PAINT_PAINTALLCHILDREN ((sal_uInt16)0x0004)
-#define IMPL_PAINT_PAINTCHILDREN ((sal_uInt16)0x0008)
-#define IMPL_PAINT_ERASE ((sal_uInt16)0x0010)
-#define IMPL_PAINT_CHECKRTL ((sal_uInt16)0x0020)
-
Window::Window( WindowType nType )
{
ImplInitWindowData( nType );
@@ -982,20 +975,6 @@ void Window::ImplInitWindowData( WindowType nType )
mbEnableRTL = Application::GetSettings().GetLayoutRTL(); // true: this outdev will be mirrored if RTL window layout (UI mirroring) is globally active
}
-static bool ImplDoTiledRendering()
-{
-#if !HAVE_FEATURE_DESKTOP
- // We do tiled rendering only for iOS at the moment, actually, but
- // let's see what happens if we assume it for Android, too.
- return true;
-#else
- // We need some way to know globally if this process will use
- // tiled rendering or not. Or should this be a per-window setting?
- // Or what?
- return false;
-#endif
-}
-
static sal_Int32 CountDPIScaleFactor(sal_Int32 nDPI)
{
sal_Int32 nResult = 1;
@@ -1015,6 +994,20 @@ static sal_Int32 CountDPIScaleFactor(sal_Int32 nDPI)
return nResult;
}
+bool ImplDoTiledRendering()
+{
+#if !HAVE_FEATURE_DESKTOP
+ // We do tiled rendering only for iOS at the moment, actually, but
+ // let's see what happens if we assume it for Android, too.
+ return true;
+#else
+ // We need some way to know globally if this process will use
+ // tiled rendering or not. Or should this be a per-window setting?
+ // Or what?
+ return false;
+#endif
+}
+
void Window::ImplInit( Window* pParent, WinBits nStyle, SystemParentData* pSystemParentData )
{
DBG_ASSERT( mpWindowImpl->mbFrame || pParent, "Window::Window(): pParent == NULL" );
@@ -1583,1009 +1576,34 @@ void Window::ImplPointToLogic( Font& rFont ) const
aSize.Height() /= 100;
if ( IsMapModeEnabled() )
- aSize = PixelToLogic( aSize );
-
- rFont.SetSize( aSize );
-}
-
-void Window::ImplLogicToPoint( Font& rFont ) const
-{
- Size aSize = rFont.GetSize();
- sal_uInt16 nScreenFontZoom = mxSettings->GetStyleSettings().GetScreenFontZoom();
-
- if ( IsMapModeEnabled() )
- aSize = LogicToPixel( aSize );
-
- if ( aSize.Width() )
- {
- aSize.Width() *= 100;
- aSize.Width() /= nScreenFontZoom;
- aSize.Width() *= 72;
- aSize.Width() += mpWindowImpl->mpFrameData->mnDPIX/2;
- aSize.Width() /= mpWindowImpl->mpFrameData->mnDPIX;
- }
- aSize.Height() *= 100;
- aSize.Height() /= nScreenFontZoom;
- aSize.Height() *= 72;
- aSize.Height() += mpWindowImpl->mpFrameData->mnDPIY/2;
- aSize.Height() /= mpWindowImpl->mpFrameData->mnDPIY;
-
- rFont.SetSize( aSize );
-}
-
-void Window::ImplIntersectWindowRegion( Region& rRegion )
-{
- rRegion.Intersect( Rectangle( Point( mnOutOffX, mnOutOffY ),
- Size( mnOutWidth, mnOutHeight ) ) );
- if ( mpWindowImpl->mbWinRegion )
- rRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
-}
-
-void Window::ImplExcludeWindowRegion( Region& rRegion )
-{
- if ( mpWindowImpl->mbWinRegion )
- {
- Point aPoint( mnOutOffX, mnOutOffY );
- Region aRegion( Rectangle( aPoint,
- Size( mnOutWidth, mnOutHeight ) ) );
- aRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
- rRegion.Exclude( aRegion );
- }
- else
- {
- Point aPoint( mnOutOffX, mnOutOffY );
- rRegion.Exclude( Rectangle( aPoint,
- Size( mnOutWidth, mnOutHeight ) ) );
- }
-}
-
-void Window::ImplExcludeOverlapWindows( Region& rRegion )
-{
- Window* pWindow = mpWindowImpl->mpFirstOverlap;
- while ( pWindow )
- {
- if ( pWindow->mpWindowImpl->mbReallyVisible )
- {
- pWindow->ImplExcludeWindowRegion( rRegion );
- pWindow->ImplExcludeOverlapWindows( rRegion );
- }
-
- pWindow = pWindow->mpWindowImpl->mpNext;
- }
-}
-
-void Window::ImplExcludeOverlapWindows2( Region& rRegion )
-{
- if ( mpWindowImpl->mbReallyVisible )
- ImplExcludeWindowRegion( rRegion );
-
- ImplExcludeOverlapWindows( rRegion );
-}
-
-void Window::ImplIntersectAndUnionOverlapWindows( const Region& rInterRegion, Region& rRegion )
-{
- Window* pWindow = mpWindowImpl->mpFirstOverlap;
- while ( pWindow )
- {
- if ( pWindow->mpWindowImpl->mbReallyVisible )
- {
- Region aTempRegion( rInterRegion );
- pWindow->ImplIntersectWindowRegion( aTempRegion );
- rRegion.Union( aTempRegion );
- pWindow->ImplIntersectAndUnionOverlapWindows( rInterRegion, rRegion );
- }
-
- pWindow = pWindow->mpWindowImpl->mpNext;
- }
-}
-
-void Window::ImplIntersectAndUnionOverlapWindows2( const Region& rInterRegion, Region& rRegion )
-{
- if ( mpWindowImpl->mbReallyVisible )
- {
- Region aTempRegion( rInterRegion );
- ImplIntersectWindowRegion( aTempRegion );
- rRegion.Union( aTempRegion );
- }
-
- ImplIntersectAndUnionOverlapWindows( rInterRegion, rRegion );
-}
-
-void Window::ImplCalcOverlapRegionOverlaps( const Region& rInterRegion, Region& rRegion )
-{
- // Clip Overlap Siblings
- Window* pStartOverlapWindow;
- if ( !ImplIsOverlapWindow() )
- pStartOverlapWindow = mpWindowImpl->mpOverlapWindow;
- else
- pStartOverlapWindow = this;
- while ( !pStartOverlapWindow->mpWindowImpl->mbFrame )
- {
- Window* pOverlapWindow = pStartOverlapWindow->mpWindowImpl->mpOverlapWindow->mpWindowImpl->mpFirstOverlap;
- while ( pOverlapWindow && (pOverlapWindow != pStartOverlapWindow) )
- {
- pOverlapWindow->ImplIntersectAndUnionOverlapWindows2( rInterRegion, rRegion );
- pOverlapWindow = pOverlapWindow->mpWindowImpl->mpNext;
- }
- pStartOverlapWindow = pStartOverlapWindow->mpWindowImpl->mpOverlapWindow;
- }
-
- // Clip Child Overlap Windows
- if ( !ImplIsOverlapWindow() )
- mpWindowImpl->mpOverlapWindow->ImplIntersectAndUnionOverlapWindows( rInterRegion, rRegion );
- else
- ImplIntersectAndUnionOverlapWindows( rInterRegion, rRegion );
-}
-
-void Window::ImplCalcOverlapRegion( const Rectangle& rSourceRect, Region& rRegion,
- bool bChildren, bool bParent, bool bSiblings )
-{
- Region aRegion( rSourceRect );
- if ( mpWindowImpl->mbWinRegion )
- rRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
- Region aTempRegion;
- Window* pWindow;
-
- ImplCalcOverlapRegionOverlaps( aRegion, rRegion );
-
- // Parent-Boundaries
- if ( bParent )
- {
- pWindow = this;
- if ( !ImplIsOverlapWindow() )
- {
- pWindow = ImplGetParent();
- do
- {
- aTempRegion = aRegion;
- pWindow->ImplExcludeWindowRegion( aTempRegion );
- rRegion.Union( aTempRegion );
- if ( pWindow->ImplIsOverlapWindow() )
- break;
- pWindow = pWindow->ImplGetParent();
- }
- while ( pWindow );
- }
- if ( pWindow && !pWindow->mpWindowImpl->mbFrame )
- {
- aTempRegion = aRegion;
- aTempRegion.Exclude( Rectangle( Point( 0, 0 ), Size( mpWindowImpl->mpFrameWindow->mnOutWidth, mpWindowImpl->mpFrameWindow->mnOutHeight ) ) );
- rRegion.Union( aTempRegion );
- }
- }
-
- // Siblings
- if ( bSiblings && !ImplIsOverlapWindow() )
- {
- pWindow = mpWindowImpl->mpParent->mpWindowImpl->mpFirstChild;
- do
- {
- if ( pWindow->mpWindowImpl->mbReallyVisible && (pWindow != this) )
- {
- aTempRegion = aRegion;
- pWindow->ImplIntersectWindowRegion( aTempRegion );
- rRegion.Union( aTempRegion );
- }
- pWindow = pWindow->mpWindowImpl->mpNext;
- }
- while ( pWindow );
- }
-
- if ( bChildren )
- {
- pWindow = mpWindowImpl->mpFirstChild;
- while ( pWindow )
- {
- if ( pWindow->mpWindowImpl->mbReallyVisible )
- {
- aTempRegion = aRegion;
- pWindow->ImplIntersectWindowRegion( aTempRegion );
- rRegion.Union( aTempRegion );
- }
- pWindow = pWindow->mpWindowImpl->mpNext;
- }
- }
-}
-
-class PaintHelper
-{
-private:
- Window* m_pWindow;
- Region* m_pChildRegion;
- Rectangle m_aSelectionRect;
- Rectangle m_aPaintRect;
- Region m_aPaintRegion;
- sal_uInt16 m_nPaintFlags;
- bool m_bPop;
- bool m_bRestoreCursor;
-public:
- PaintHelper(Window *pWindow, sal_uInt16 nPaintFlags);
- void SetPop()
- {
- m_bPop = true;
- }
- void SetPaintRect(const Rectangle& rRect)
- {
- m_aPaintRect = rRect;
- }
- void SetSelectionRect(const Rectangle& rRect)
- {
- m_aSelectionRect = rRect;
- }
- void SetRestoreCursor(bool bRestoreCursor)
- {
- m_bRestoreCursor = bRestoreCursor;
- }
- bool GetRestoreCursor() const
- {
- return m_bRestoreCursor;
- }
- sal_uInt16 GetPaintFlags() const
- {
- return m_nPaintFlags;
- }
- Region& GetPaintRegion()
- {
- return m_aPaintRegion;
- }
- void DoPaint(const Region* pRegion);
- ~PaintHelper();
-};
-
-PaintHelper::PaintHelper(Window *pWindow, sal_uInt16 nPaintFlags)
- : m_pWindow(pWindow)
- , m_pChildRegion(NULL)
- , m_nPaintFlags(nPaintFlags)
- , m_bPop(false)
- , m_bRestoreCursor(false)
-{
-}
-
-void PaintHelper::DoPaint(const Region* pRegion)
-{
- WindowImpl* pWindowImpl = m_pWindow->ImplGetWindowImpl();
- Region* pWinChildClipRegion = m_pWindow->ImplGetWinChildClipRegion();
- if ( pWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL )
- pWindowImpl->maInvalidateRegion = *pWinChildClipRegion;
- else
- {
- if ( pRegion )
- pWindowImpl->maInvalidateRegion.Union( *pRegion );
-
- if( pWindowImpl->mpWinData && pWindowImpl->mbTrackVisible )
- /* #98602# need to repaint all children within the
- * tracking rectangle, so the following invert
- * operation takes places without traces of the previous
- * one.
- */
- pWindowImpl->maInvalidateRegion.Union( *pWindowImpl->mpWinData->mpTrackRect );
-
- if ( pWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALLCHILDREN )
- m_pChildRegion = new Region( pWindowImpl->maInvalidateRegion );
- pWindowImpl->maInvalidateRegion.Intersect( *pWinChildClipRegion );
- }
- pWindowImpl->mnPaintFlags = 0;
- if ( !pWindowImpl->maInvalidateRegion.IsEmpty() )
- {
- m_pWindow->PushPaintHelper(this);
- m_pWindow->Paint(m_aPaintRect);
- }
-}
-
-void Window::PushPaintHelper(PaintHelper *pHelper)
-{
- pHelper->SetPop();
-
- if ( mpWindowImpl->mpCursor )
- pHelper->SetRestoreCursor(mpWindowImpl->mpCursor->ImplSuspend());
-
- mbInitClipRegion = true;
- mpWindowImpl->mbInPaint = true;
-
- // restore Paint-Region
- Region &rPaintRegion = pHelper->GetPaintRegion();
- rPaintRegion = mpWindowImpl->maInvalidateRegion;
- Rectangle aPaintRect = rPaintRegion.GetBoundRect();
-
- // - RTL - re-mirror paint rect and region at this window
- if( ImplIsAntiparallel() )
- {
- const OutputDevice *pOutDev = GetOutDev();
- pOutDev->ReMirror( aPaintRect );
- pOutDev->ReMirror( rPaintRegion );
- }
- aPaintRect = ImplDevicePixelToLogic( aPaintRect);
- mpWindowImpl->mpPaintRegion = &rPaintRegion;
- mpWindowImpl->maInvalidateRegion.SetEmpty();
-
- if ( (pHelper->GetPaintFlags() & IMPL_PAINT_ERASE) && IsBackground() )
- {
- if ( IsClipRegion() )
- {
- Region aOldRegion = GetClipRegion();
- SetClipRegion();
- Erase();
- SetClipRegion( aOldRegion );
- }
- else
- Erase();
- }
-
- // #98943# trigger drawing of toolbox selection after all childern are painted
- if( mpWindowImpl->mbDrawSelectionBackground )
- pHelper->SetSelectionRect(aPaintRect);
- pHelper->SetPaintRect(aPaintRect);
-}
-
-void Window::PopPaintHelper(PaintHelper *pHelper)
-{
- if ( mpWindowImpl->mpWinData )
- {
- if ( mpWindowImpl->mbFocusVisible )
- ImplInvertFocus( *(mpWindowImpl->mpWinData->mpFocusRect) );
- }
- mpWindowImpl->mbInPaint = false;
- mbInitClipRegion = true;
- mpWindowImpl->mpPaintRegion = NULL;
- if ( mpWindowImpl->mpCursor )
- mpWindowImpl->mpCursor->ImplResume(pHelper->GetRestoreCursor());
-}
-
-PaintHelper::~PaintHelper()
-{
- WindowImpl* pWindowImpl = m_pWindow->ImplGetWindowImpl();
- if (m_bPop)
- {
- m_pWindow->PopPaintHelper(this);
- }
-
- if ( m_nPaintFlags & (IMPL_PAINT_PAINTALLCHILDREN | IMPL_PAINT_PAINTCHILDREN) )
- {
- // Paint from the bottom child window and frontward.
- Window* pTempWindow = pWindowImpl->mpLastChild;
- while ( pTempWindow )
- {
- if ( pTempWindow->mpWindowImpl->mbVisible )
- pTempWindow->ImplCallPaint( m_pChildRegion, m_nPaintFlags );
- pTempWindow = pTempWindow->mpWindowImpl->mpPrev;
- }
- }
-
- if ( pWindowImpl->mpWinData && pWindowImpl->mbTrackVisible && (pWindowImpl->mpWinData->mnTrackFlags & SHOWTRACK_WINDOW) )
- /* #98602# need to invert the tracking rect AFTER
- * the children have painted
- */
- m_pWindow->InvertTracking( *(pWindowImpl->mpWinData->mpTrackRect), pWindowImpl->mpWinData->mnTrackFlags );
-
- // #98943# draw toolbox selection
- if( !m_aSelectionRect.IsEmpty() )
- m_pWindow->DrawSelectionBackground( m_aSelectionRect, 3, false, true, false );
-
- delete m_pChildRegion;
-}
-
-void Window::ImplCallPaint( const Region* pRegion, sal_uInt16 nPaintFlags )
-{
- // call PrePaint. PrePaint may add to the invalidate region as well as
- // other parameters used below.
- PrePaint();
-
- mpWindowImpl->mbPaintFrame = false;
-
- if ( nPaintFlags & IMPL_PAINT_PAINTALLCHILDREN )
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_PAINT | IMPL_PAINT_PAINTALLCHILDREN | (nPaintFlags & IMPL_PAINT_PAINTALL);
- if ( nPaintFlags & IMPL_PAINT_PAINTCHILDREN )
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_PAINTCHILDREN;
- if ( nPaintFlags & IMPL_PAINT_ERASE )
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_ERASE;
- if ( nPaintFlags & IMPL_PAINT_CHECKRTL )
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_CHECKRTL;
- if ( !mpWindowImpl->mpFirstChild )
- mpWindowImpl->mnPaintFlags &= ~IMPL_PAINT_PAINTALLCHILDREN;
-
- if ( mpWindowImpl->mbPaintDisabled )
- {
- if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL )
- Invalidate( INVALIDATE_NOCHILDREN | INVALIDATE_NOERASE | INVALIDATE_NOTRANSPARENT | INVALIDATE_NOCLIPCHILDREN );
- else if ( pRegion )
- Invalidate( *pRegion, INVALIDATE_NOCHILDREN | INVALIDATE_NOERASE | INVALIDATE_NOTRANSPARENT | INVALIDATE_NOCLIPCHILDREN );
- return;
- }
-
- nPaintFlags = mpWindowImpl->mnPaintFlags & ~(IMPL_PAINT_PAINT);
-
- PaintHelper aHelper(this, nPaintFlags);
-
- if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINT )
- aHelper.DoPaint(pRegion);
- else
- mpWindowImpl->mnPaintFlags = 0;
-}
-
-void Window::ImplCallOverlapPaint()
-{
- // emit overlapping windows first
- Window* pTempWindow = mpWindowImpl->mpFirstOverlap;
- while ( pTempWindow )
- {
- if ( pTempWindow->mpWindowImpl->mbReallyVisible )
- pTempWindow->ImplCallOverlapPaint();
- pTempWindow = pTempWindow->mpWindowImpl->mpNext;
- }
-
- // only then ourself
- if ( mpWindowImpl->mnPaintFlags & (IMPL_PAINT_PAINT | IMPL_PAINT_PAINTCHILDREN) )
- {
- // - RTL - notify ImplCallPaint to check for re-mirroring (CHECKRTL)
- // because we were called from the Sal layer
- ImplCallPaint( NULL, mpWindowImpl->mnPaintFlags /*| IMPL_PAINT_CHECKRTL */);
- }
-}
-
-void Window::ImplPostPaint()
-{
- if ( !ImplDoTiledRendering() && !mpWindowImpl->mpFrameData->maPaintTimer.IsActive() )
- mpWindowImpl->mpFrameData->maPaintTimer.Start();
-}
-
-IMPL_LINK_NOARG(Window, ImplHandlePaintHdl)
-{
- // save paint events until layout is done
- if (!ImplDoTiledRendering() && IsDialog() && static_cast<const Dialog*>(this)->hasPendingLayout())
- {
- mpWindowImpl->mpFrameData->maPaintTimer.Start();
- return 0;
- }
-
- // save paint events until resizing is done
- if( !ImplDoTiledRendering() &&
- mpWindowImpl->mbFrame && mpWindowImpl->mpFrameData->maResizeTimer.IsActive() )
- mpWindowImpl->mpFrameData->maPaintTimer.Start();
- else if ( mpWindowImpl->mbReallyVisible )
- ImplCallOverlapPaint();
- return 0;
-}
-
-IMPL_LINK_NOARG(Window, ImplHandleResizeTimerHdl)
-{
- if( mpWindowImpl->mbReallyVisible )
- {
- ImplCallResize();
- if( ImplDoTiledRendering() )
- {
- ImplHandlePaintHdl(NULL);
- }
- else if( mpWindowImpl->mpFrameData->maPaintTimer.IsActive() )
- {
- mpWindowImpl->mpFrameData->maPaintTimer.Stop();
- mpWindowImpl->mpFrameData->maPaintTimer.GetTimeoutHdl().Call( NULL );
- }
- }
-
- return 0;
-}
-
-void Window::ImplInvalidateFrameRegion( const Region* pRegion, sal_uInt16 nFlags )
-{
- // set PAINTCHILDREN for all parent windows till the first OverlapWindow
- if ( !ImplIsOverlapWindow() )
- {
- Window* pTempWindow = this;
- sal_uInt16 nTranspPaint = IsPaintTransparent() ? IMPL_PAINT_PAINT : 0;
- do
- {
- pTempWindow = pTempWindow->ImplGetParent();
- if ( pTempWindow->mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTCHILDREN )
- break;
- pTempWindow->mpWindowImpl->mnPaintFlags |= IMPL_PAINT_PAINTCHILDREN | nTranspPaint;
- if( ! pTempWindow->IsPaintTransparent() )
- nTranspPaint = 0;
- }
- while ( !pTempWindow->ImplIsOverlapWindow() );
- }
-
- // set Paint-Flags
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_PAINT;
- if ( nFlags & INVALIDATE_CHILDREN )
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_PAINTALLCHILDREN;
- if ( !(nFlags & INVALIDATE_NOERASE) )
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_ERASE;
- if ( !pRegion )
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_PAINTALL;
-
- // if not everything has to be redrawn, add the region to it
- if ( !(mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL) )
- mpWindowImpl->maInvalidateRegion.Union( *pRegion );
-
- // Handle transparent windows correctly: invalidate must be done on the first opaque parent
- if( ((IsPaintTransparent() && !(nFlags & INVALIDATE_NOTRANSPARENT)) || (nFlags & INVALIDATE_TRANSPARENT) )
- && ImplGetParent() )
- {
- Window *pParent = ImplGetParent();
- while( pParent && pParent->IsPaintTransparent() )
- pParent = pParent->ImplGetParent();
- if( pParent )
- {
- Region *pChildRegion;
- if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL )
- // invalidate the whole child window region in the parent
- pChildRegion = ImplGetWinChildClipRegion();
- else
- // invalidate the same region in the parent that has to be repainted in the child
- pChildRegion = &mpWindowImpl->maInvalidateRegion;
-
- nFlags |= INVALIDATE_CHILDREN; // paint should also be done on all children
- nFlags &= ~INVALIDATE_NOERASE; // parent should paint and erase to create proper background
- pParent->ImplInvalidateFrameRegion( pChildRegion, nFlags );
- }
- }
- ImplPostPaint();
-}
-
-void Window::ImplInvalidateOverlapFrameRegion( const Region& rRegion )
-{
- Region aRegion = rRegion;
-
- ImplClipBoundaries( aRegion, true, true );
- if ( !aRegion.IsEmpty() )
- ImplInvalidateFrameRegion( &aRegion, INVALIDATE_CHILDREN );
-
- // now we invalidate the overlapping windows
- Window* pTempWindow = mpWindowImpl->mpFirstOverlap;
- while ( pTempWindow )
- {
- if ( pTempWindow->IsVisible() )
- pTempWindow->ImplInvalidateOverlapFrameRegion( rRegion );
-
- pTempWindow = pTempWindow->mpWindowImpl->mpNext;
- }
-}
-
-void Window::ImplInvalidateParentFrameRegion( Region& rRegion )
-{
- if ( mpWindowImpl->mbOverlapWin )
- mpWindowImpl->mpFrameWindow->ImplInvalidateOverlapFrameRegion( rRegion );
- else
- {
- if( ImplGetParent() )
- ImplGetParent()->ImplInvalidateFrameRegion( &rRegion, INVALIDATE_CHILDREN );
- }
-}
-
-void Window::ImplInvalidate( const Region* pRegion, sal_uInt16 nFlags )
-{
-
- // reset background storage
- if ( mpWindowImpl->mpFrameData->mpFirstBackWin )
- ImplInvalidateAllOverlapBackgrounds();
-
- // check what has to be redrawn
- bool bInvalidateAll = !pRegion;
-
- // take Transparent-Invalidate into account
- Window* pOpaqueWindow = this;
- if ( (mpWindowImpl->mbPaintTransparent && !(nFlags & INVALIDATE_NOTRANSPARENT)) || (nFlags & INVALIDATE_TRANSPARENT) )
- {
- Window* pTempWindow = pOpaqueWindow->ImplGetParent();
- while ( pTempWindow )
- {
- if ( !pTempWindow->IsPaintTransparent() )
- {
- pOpaqueWindow = pTempWindow;
- nFlags |= INVALIDATE_CHILDREN;
- bInvalidateAll = false;
- break;
- }
-
- if ( pTempWindow->ImplIsOverlapWindow() )
- break;
-
- pTempWindow = pTempWindow->ImplGetParent();
- }
- }
-
- // assemble region
- sal_uInt16 nOrgFlags = nFlags;
- if ( !(nFlags & (INVALIDATE_CHILDREN | INVALIDATE_NOCHILDREN)) )
- {
- if ( GetStyle() & WB_CLIPCHILDREN )
- nFlags |= INVALIDATE_NOCHILDREN;
- else
- nFlags |= INVALIDATE_CHILDREN;
- }
- if ( (nFlags & INVALIDATE_NOCHILDREN) && mpWindowImpl->mpFirstChild )
- bInvalidateAll = false;
- if ( bInvalidateAll )
- ImplInvalidateFrameRegion( NULL, nFlags );
- else
- {
- Rectangle aRect( Point( mnOutOffX, mnOutOffY ), Size( mnOutWidth, mnOutHeight ) );
- Region aRegion( aRect );
- if ( pRegion )
- {
- // --- RTL --- remirror region before intersecting it
- if ( ImplIsAntiparallel() )
- {
- const OutputDevice *pOutDev = GetOutDev();
-
- Region aRgn( *pRegion );
- pOutDev->ReMirror( aRgn );
- aRegion.Intersect( aRgn );
- }
- else
- aRegion.Intersect( *pRegion );
- }
- ImplClipBoundaries( aRegion, true, true );
- if ( nFlags & INVALIDATE_NOCHILDREN )
- {
- nFlags &= ~INVALIDATE_CHILDREN;
- if ( !(nFlags & INVALIDATE_NOCLIPCHILDREN) )
- {
- if ( nOrgFlags & INVALIDATE_NOCHILDREN )
- ImplClipAllChildren( aRegion );
- else
- {
- if ( ImplClipChildren( aRegion ) )
- nFlags |= INVALIDATE_CHILDREN;
- }
- }
- }
- if ( !aRegion.IsEmpty() )
- ImplInvalidateFrameRegion( &aRegion, nFlags ); // transparency is handled here, pOpaqueWindow not required
- }
-
- if ( nFlags & INVALIDATE_UPDATE )
- pOpaqueWindow->Update(); // start painting at the opaque parent
-}
-
-void Window::ImplMoveInvalidateRegion( const Rectangle& rRect,
- long nHorzScroll, long nVertScroll,
- bool bChildren )
-{
- if ( (mpWindowImpl->mnPaintFlags & (IMPL_PAINT_PAINT | IMPL_PAINT_PAINTALL)) == IMPL_PAINT_PAINT )
- {
- Region aTempRegion = mpWindowImpl->maInvalidateRegion;
- aTempRegion.Intersect( rRect );
- aTempRegion.Move( nHorzScroll, nVertScroll );
- mpWindowImpl->maInvalidateRegion.Union( aTempRegion );
- }
-
- if ( bChildren && (mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTCHILDREN) )
- {
- Window* pWindow = mpWindowImpl->mpFirstChild;
- while ( pWindow )
- {
- pWindow->ImplMoveInvalidateRegion( rRect, nHorzScroll, nVertScroll, true );
- pWindow = pWindow->mpWindowImpl->mpNext;
- }
- }
-}
-
-void Window::ImplMoveAllInvalidateRegions( const Rectangle& rRect,
- long nHorzScroll, long nVertScroll,
- bool bChildren )
-{
- // also shift Paint-Region when paints need processing
- ImplMoveInvalidateRegion( rRect, nHorzScroll, nVertScroll, bChildren );
- // Paint-Region should be shifted, as drawn by the parents
- if ( !ImplIsOverlapWindow() )
- {
- Region aPaintAllRegion;
- Window* pPaintAllWindow = this;
- do
- {
- pPaintAllWindow = pPaintAllWindow->ImplGetParent();
- if ( pPaintAllWindow->mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALLCHILDREN )
- {
- if ( pPaintAllWindow->mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL )
- {
- aPaintAllRegion.SetEmpty();
- break;
- }
- else
- aPaintAllRegion.Union( pPaintAllWindow->mpWindowImpl->maInvalidateRegion );
- }
- }
- while ( !pPaintAllWindow->ImplIsOverlapWindow() );
- if ( !aPaintAllRegion.IsEmpty() )
- {
- aPaintAllRegion.Move( nHorzScroll, nVertScroll );
- sal_uInt16 nPaintFlags = 0;
- if ( bChildren )
- mpWindowImpl->mnPaintFlags |= INVALIDATE_CHILDREN;
- ImplInvalidateFrameRegion( &aPaintAllRegion, nPaintFlags );
- }
- }
-}
-
-void Window::ImplValidateFrameRegion( const Region* pRegion, sal_uInt16 nFlags )
-{
- if ( !pRegion )
- mpWindowImpl->maInvalidateRegion.SetEmpty();
- else
- {
- // when all child windows have to be drawn we need to invalidate them before doing so
- if ( (mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALLCHILDREN) && mpWindowImpl->mpFirstChild )
- {
- Region aChildRegion = mpWindowImpl->maInvalidateRegion;
- if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL )
- {
- Rectangle aRect( Point( mnOutOffX, mnOutOffY ), Size( mnOutWidth, mnOutHeight ) );
- aChildRegion = aRect;
- }
- Window* pChild = mpWindowImpl->mpFirstChild;
- while ( pChild )
- {
- pChild->Invalidate( aChildRegion, INVALIDATE_CHILDREN | INVALIDATE_NOTRANSPARENT );
- pChild = pChild->mpWindowImpl->mpNext;
- }
- }
- if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL )
- {
- Rectangle aRect( Point( mnOutOffX, mnOutOffY ), Size( mnOutWidth, mnOutHeight ) );
- mpWindowImpl->maInvalidateRegion = aRect;
- }
- mpWindowImpl->maInvalidateRegion.Exclude( *pRegion );
- }
- mpWindowImpl->mnPaintFlags &= ~IMPL_PAINT_PAINTALL;
-
- if ( nFlags & VALIDATE_CHILDREN )
- {
- Window* pChild = mpWindowImpl->mpFirstChild;
- while ( pChild )
- {
- pChild->ImplValidateFrameRegion( pRegion, nFlags );
- pChild = pChild->mpWindowImpl->mpNext;
- }
- }
-}
-
-void Window::ImplValidate( const Region* pRegion, sal_uInt16 nFlags )
-{
- // assemble region
- bool bValidateAll = !pRegion;
- sal_uInt16 nOrgFlags = nFlags;
- if ( !(nFlags & (VALIDATE_CHILDREN | VALIDATE_NOCHILDREN)) )
- {
- if ( GetStyle() & WB_CLIPCHILDREN )
- nFlags |= VALIDATE_NOCHILDREN;
- else
- nFlags |= VALIDATE_CHILDREN;
- }
- if ( (nFlags & VALIDATE_NOCHILDREN) && mpWindowImpl->mpFirstChild )
- bValidateAll = false;
- if ( bValidateAll )
- ImplValidateFrameRegion( NULL, nFlags );
- else
- {
- Rectangle aRect( Point( mnOutOffX, mnOutOffY ), Size( mnOutWidth, mnOutHeight ) );
- Region aRegion( aRect );
- if ( pRegion )
- aRegion.Intersect( *pRegion );
- ImplClipBoundaries( aRegion, true, true );
- if ( nFlags & VALIDATE_NOCHILDREN )
- {
- nFlags &= ~VALIDATE_CHILDREN;
- if ( nOrgFlags & VALIDATE_NOCHILDREN )
- ImplClipAllChildren( aRegion );
- else
- {
- if ( ImplClipChildren( aRegion ) )
- nFlags |= VALIDATE_CHILDREN;
- }
- }
- if ( !aRegion.IsEmpty() )
- ImplValidateFrameRegion( &aRegion, nFlags );
- }
-}
-
-void Window::ImplScroll( const Rectangle& rRect,
- long nHorzScroll, long nVertScroll, sal_uInt16 nFlags )
-{
- if ( !IsDeviceOutputNecessary() )
- return;
-
- nHorzScroll = ImplLogicWidthToDevicePixel( nHorzScroll );
- nVertScroll = ImplLogicHeightToDevicePixel( nVertScroll );
-
- if ( !nHorzScroll && !nVertScroll )
- return;
-
- // restore background storage
- if ( mpWindowImpl->mpFrameData->mpFirstBackWin )
- ImplInvalidateAllOverlapBackgrounds();
-
- if ( mpWindowImpl->mpCursor )
- mpWindowImpl->mpCursor->ImplSuspend();
-
- sal_uInt16 nOrgFlags = nFlags;
- if ( !(nFlags & (SCROLL_CHILDREN | SCROLL_NOCHILDREN)) )
- {
- if ( GetStyle() & WB_CLIPCHILDREN )
- nFlags |= SCROLL_NOCHILDREN;
- else
- nFlags |= SCROLL_CHILDREN;
- }
-
- Region aInvalidateRegion;
- bool bScrollChildren = (nFlags & SCROLL_CHILDREN) != 0;
- bool bErase = (nFlags & SCROLL_NOERASE) == 0;
-
- if ( !mpWindowImpl->mpFirstChild )
- bScrollChildren = false;
-
- OutputDevice *pOutDev = GetOutDev();
-
- // --- RTL --- check if this window requires special action
- bool bReMirror = ( ImplIsAntiparallel() );
-
- Rectangle aRectMirror( rRect );
- if( bReMirror )
- {
- // --- RTL --- make sure the invalidate region of this window is
- // computed in the same coordinate space as the one from the overlap windows
- pOutDev->ReMirror( aRectMirror );
- }
-
- // adapt paint areas
- ImplMoveAllInvalidateRegions( aRectMirror, nHorzScroll, nVertScroll, bScrollChildren );
-
- if ( !(nFlags & SCROLL_NOINVALIDATE) )
- {
- ImplCalcOverlapRegion( aRectMirror, aInvalidateRegion, !bScrollChildren, true, false );
-
- // --- RTL ---
- // if the scrolling on the device is performed in the opposite direction
- // then move the overlaps in that direction to compute the invalidate region
- // on the correct side, i.e., revert nHorzScroll
-
- if ( !aInvalidateRegion.IsEmpty() )
- {
- aInvalidateRegion.Move( bReMirror ? -nHorzScroll : nHorzScroll, nVertScroll );
- bErase = true;
- }
- if ( !(nFlags & SCROLL_NOWINDOWINVALIDATE) )
- {
- Rectangle aDestRect( aRectMirror );
- aDestRect.Move( bReMirror ? -nHorzScroll : nHorzScroll, nVertScroll );
- Region aWinInvalidateRegion( aRectMirror );
- aWinInvalidateRegion.Exclude( aDestRect );
-
- aInvalidateRegion.Union( aWinInvalidateRegion );
- }
- }
-
- Point aPoint( mnOutOffX, mnOutOffY );
- Region aRegion( Rectangle( aPoint, Size( mnOutWidth, mnOutHeight ) ) );
- if ( nFlags & SCROLL_CLIP )
- aRegion.Intersect( rRect );
- if ( mpWindowImpl->mbWinRegion )
- aRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
-
- aRegion.Exclude( aInvalidateRegion );
-
- ImplClipBoundaries( aRegion, false, true );
- if ( !bScrollChildren )
- {
- if ( nOrgFlags & SCROLL_NOCHILDREN )
- ImplClipAllChildren( aRegion );
- else
- ImplClipChildren( aRegion );
- }
- if ( mbClipRegion && (nFlags & SCROLL_USECLIPREGION) )
- aRegion.Intersect( maRegion );
- if ( !aRegion.IsEmpty() )
- {
- if ( mpWindowImpl->mpWinData )
- {
- if ( mpWindowImpl->mbFocusVisible )
- ImplInvertFocus( *(mpWindowImpl->mpWinData->mpFocusRect) );
- if ( mpWindowImpl->mbTrackVisible && (mpWindowImpl->mpWinData->mnTrackFlags & SHOWTRACK_WINDOW) )
- InvertTracking( *(mpWindowImpl->mpWinData->mpTrackRect), mpWindowImpl->mpWinData->mnTrackFlags );
- }
-#ifndef IOS
- // This seems completely unnecessary with tiled rendering, and
- // causes the "AquaSalGraphics::copyArea() for non-layered
- // graphics" message. Presumably we should bypass this on all
- // platforms when dealing with a "window" that uses tiled
- // rendering at the moment. Unclear how to figure that out,
- // though. Also unclear whether we actually could just not
- // create a "frame window", whatever that exactly is, in the
- // tiled rendering case, or at least for platforms where tiles
- // rendering is all there is.
-
- SalGraphics* pGraphics = ImplGetFrameGraphics();
- if ( pGraphics )
- {
- if( bReMirror )
- {
- // --- RTL --- frame coordinates require re-mirroring
- pOutDev->ReMirror( aRegion );
- }
-
- pOutDev->SelectClipRegion( aRegion, pGraphics );
- pGraphics->CopyArea( rRect.Left()+nHorzScroll, rRect.Top()+nVertScroll,
- rRect.Left(), rRect.Top(),
- rRect.GetWidth(), rRect.GetHeight(),
- SAL_COPYAREA_WINDOWINVALIDATE, this );
- }
-#endif
- if ( mpWindowImpl->mpWinData )
- {
- if ( mpWindowImpl->mbFocusVisible )
- ImplInvertFocus( *(mpWindowImpl->mpWinData->mpFocusRect) );
- if ( mpWindowImpl->mbTrackVisible && (mpWindowImpl->mpWinData->mnTrackFlags & SHOWTRACK_WINDOW) )
- InvertTracking( *(mpWindowImpl->mpWinData->mpTrackRect), mpWindowImpl->mpWinData->mnTrackFlags );
- }
- }
-
- if ( !aInvalidateRegion.IsEmpty() )
- {
- // --- RTL --- the invalidate region for this windows is already computed in frame coordinates
- // so it has to be re-mirrored before calling the Paint-handler
- mpWindowImpl->mnPaintFlags |= IMPL_PAINT_CHECKRTL;
-
- sal_uInt16 nPaintFlags = INVALIDATE_CHILDREN;
- if ( !bErase )
- nPaintFlags |= INVALIDATE_NOERASE;
- if ( !bScrollChildren )
- {
- if ( nOrgFlags & SCROLL_NOCHILDREN )
- ImplClipAllChildren( aInvalidateRegion );
- else
- ImplClipChildren( aInvalidateRegion );
- }
- ImplInvalidateFrameRegion( &aInvalidateRegion, nPaintFlags );
- }
-
- if ( bScrollChildren )
- {
- Window* pWindow = mpWindowImpl->mpFirstChild;
- while ( pWindow )
- {
- Point aPos = pWindow->GetPosPixel();
- aPos += Point( nHorzScroll, nVertScroll );
- pWindow->SetPosPixel( aPos );
-
- pWindow = pWindow->mpWindowImpl->mpNext;
- }
- }
-
- if ( nFlags & SCROLL_UPDATE )
- Update();
+ aSize = PixelToLogic( aSize );
- if ( mpWindowImpl->mpCursor )
- mpWindowImpl->mpCursor->ImplResume();
+ rFont.SetSize( aSize );
}
-void Window::ImplUpdateAll( bool bOverlapWindows )
+void Window::ImplLogicToPoint( Font& rFont ) const
{
- if ( !mpWindowImpl->mbReallyVisible )
- return;
+ Size aSize = rFont.GetSize();
+ sal_uInt16 nScreenFontZoom = mxSettings->GetStyleSettings().GetScreenFontZoom();
- bool bFlush = false;
- if ( mpWindowImpl->mpFrameWindow->mpWindowImpl->mbPaintFrame )
- {
- Point aPoint( 0, 0 );
- Region aRegion( Rectangle( aPoint, Size( mnOutWidth, mnOutHeight ) ) );
- ImplInvalidateOverlapFrameRegion( aRegion );
- if ( mpWindowImpl->mbFrame || (mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame) )
- bFlush = true;
- }
+ if ( IsMapModeEnabled() )
+ aSize = LogicToPixel( aSize );
- // an update changes the OverlapWindow, such that for later paints
- // not too much has to be drawn, if ALLCHILDREN etc. is set
- Window* pWindow = ImplGetFirstOverlapWindow();
- if ( bOverlapWindows )
- pWindow->ImplCallOverlapPaint();
- else
+ if ( aSize.Width() )
{
- if ( pWindow->mpWindowImpl->mnPaintFlags & (IMPL_PAINT_PAINT | IMPL_PAINT_PAINTCHILDREN) )
- pWindow->ImplCallPaint( NULL, pWindow->mpWindowImpl->mnPaintFlags );
+ aSize.Width() *= 100;
+ aSize.Width() /= nScreenFontZoom;
+ aSize.Width() *= 72;
+ aSize.Width() += mpWindowImpl->mpFrameData->mnDPIX/2;
+ aSize.Width() /= mpWindowImpl->mpFrameData->mnDPIX;
}
+ aSize.Height() *= 100;
+ aSize.Height() /= nScreenFontZoom;
+ aSize.Height() *= 72;
+ aSize.Height() += mpWindowImpl->mpFrameData->mnDPIY/2;
+ aSize.Height() /= mpWindowImpl->mpFrameData->mnDPIY;
- if ( bFlush )
- Flush();
+ rFont.SetSize( aSize );
}
void Window::ImplUpdateWindowPtr( Window* pWindow )
@@ -3079,19 +2097,6 @@ void Window::KeyUp( const KeyEvent& rKEvt )
mpWindowImpl->mbKeyUp = true;
}
-void Window::PrePaint()
-{
-}
-
-void Window::Paint( const Rectangle& rRect )
-{
- ImplCallEventListeners( VCLEVENT_WINDOW_PAINT, (void*)&rRect );
-}
-
-void Window::PostPaint()
-{
-}
-
void Window::Draw( OutputDevice*, const Point&, const Size&, sal_uLong )
{
}
@@ -3359,19 +2364,6 @@ long Window::CalcTitleWidth() const
return 0;
}
-void Window::SetPaintTransparent( bool bTransparent )
-{
-
- // transparency is not useful for frames as the background would have to be provided by a different frame
- if( bTransparent && mpWindowImpl->mbFrame )
- return;
-
- if ( mpWindowImpl->mpBorderWindow )
- mpWindowImpl->mpBorderWindow->SetPaintTransparent( bTransparent );
-
- mpWindowImpl->mbPaintTransparent = bTransparent;
-}
-
void Window::SetInputContext( const InputContext& rInputContext )
{
@@ -3468,160 +2460,6 @@ Font Window::GetPointFont() const
return aFont;
}
-void Window::SetWindowRegionPixel()
-{
-
- if ( mpWindowImpl->mpBorderWindow )
- mpWindowImpl->mpBorderWindow->SetWindowRegionPixel();
- else if( mpWindowImpl->mbFrame )
- {
- mpWindowImpl->maWinRegion = Region(true);
- mpWindowImpl->mbWinRegion = false;
- mpWindowImpl->mpFrame->ResetClipRegion();
- }
- else
- {
- if ( mpWindowImpl->mbWinRegion )
- {
- mpWindowImpl->maWinRegion = Region(true);
- mpWindowImpl->mbWinRegion = false;
- ImplSetClipFlag();
-
- if ( IsReallyVisible() )
- {
- // restore background storage
- if ( mpWindowImpl->mpOverlapData && mpWindowImpl->mpOverlapData->mpSaveBackDev )
- ImplDeleteOverlapBackground();
- if ( mpWindowImpl->mpFrameData->mpFirstBackWin )
- ImplInvalidateAllOverlapBackgrounds();
- Rectangle aRect( Point( mnOutOffX, mnOutOffY ), Size( mnOutWidth, mnOutHeight ) );
- Region aRegion( aRect );
- ImplInvalidateParentFrameRegion( aRegion );
- }
- }
- }
-}
-
-void Window::SetWindowRegionPixel( const Region& rRegion )
-{
-
- if ( mpWindowImpl->mpBorderWindow )
- mpWindowImpl->mpBorderWindow->SetWindowRegionPixel( rRegion );
- else if( mpWindowImpl->mbFrame )
- {
- if( !rRegion.IsNull() )
- {
- mpWindowImpl->maWinRegion = rRegion;
- mpWindowImpl->mbWinRegion = ! rRegion.IsEmpty();
-
- if( mpWindowImpl->mbWinRegion )
- {
- // set/update ClipRegion
- RectangleVector aRectangles;
- mpWindowImpl->maWinRegion.GetRegionRectangles(aRectangles);
- mpWindowImpl->mpFrame->BeginSetClipRegion(aRectangles.size());
-
- for(RectangleVector::const_iterator aRectIter(aRectangles.begin()); aRectIter != aRectangles.end(); ++aRectIter)
- {
- mpWindowImpl->mpFrame->UnionClipRegion(
- aRectIter->Left(),
- aRectIter->Top(),
- aRectIter->GetWidth(), // orig nWidth was ((R - L) + 1), same as GetWidth does
- aRectIter->GetHeight()); // same for height
- }
-
- mpWindowImpl->mpFrame->EndSetClipRegion();
-
- //long nX;
- //long nY;
- //long nWidth;
- //long nHeight;
- //sal_uLong nRectCount;
- //ImplRegionInfo aInfo;
- //sal_Bool bRegionRect;
-
- //nRectCount = mpWindowImpl->maWinRegion.GetRectCount();
- //mpWindowImpl->mpFrame->BeginSetClipRegion( nRectCount );
- //bRegionRect = mpWindowImpl->maWinRegion.ImplGetFirstRect( aInfo, nX, nY, nWidth, nHeight );
- //while ( bRegionRect )
- //{
- // mpWindowImpl->mpFrame->UnionClipRegion( nX, nY, nWidth, nHeight );
- // bRegionRect = mpWindowImpl->maWinRegion.ImplGetNextRect( aInfo, nX, nY, nWidth, nHeight );
- //}
- //mpWindowImpl->mpFrame->EndSetClipRegion();
- }
- else
- SetWindowRegionPixel();
- }
- else
- SetWindowRegionPixel();
- }
- else
- {
- if ( rRegion.IsNull() )
- {
- if ( mpWindowImpl->mbWinRegion )
- {
- mpWindowImpl->maWinRegion = Region(true);
- mpWindowImpl->mbWinRegion = false;
- ImplSetClipFlag();
- }
- }
- else
- {
- mpWindowImpl->maWinRegion = rRegion;
- mpWindowImpl->mbWinRegion = true;
- ImplSetClipFlag();
- }
-
- if ( IsReallyVisible() )
- {
- // restore background storage
- if ( mpWindowImpl->mpOverlapData && mpWindowImpl->mpOverlapData->mpSaveBackDev )
- ImplDeleteOverlapBackground();
- if ( mpWindowImpl->mpFrameData->mpFirstBackWin )
- ImplInvalidateAllOverlapBackgrounds();
- Rectangle aRect( Point( mnOutOffX, mnOutOffY ), Size( mnOutWidth, mnOutHeight ) );
- Region aRegion( aRect );
- ImplInvalidateParentFrameRegion( aRegion );
- }
- }
-}
-
-const Region& Window::GetWindowRegionPixel() const
-{
-
- if ( mpWindowImpl->mpBorderWindow )
- return mpWindowImpl->mpBorderWindow->GetWindowRegionPixel();
- else
- return mpWindowImpl->maWinRegion;
-}
-
-bool Window::IsWindowRegionPixel() const
-{
-
- if ( mpWindowImpl->mpBorderWindow )
- return mpWindowImpl->mpBorderWindow->IsWindowRegionPixel();
- else
- return mpWindowImpl->mbWinRegion;
-}
-
-Region Window::GetPaintRegion() const
-{
-
- if ( mpWindowImpl->mpPaintRegion )
- {
- Region aRegion = *mpWindowImpl->mpPaintRegion;
- aRegion.Move( -mnOutOffX, -mnOutOffY );
- return PixelToLogic( aRegion );
- }
- else
- {
- Region aPaintRegion(true);
- return aPaintRegion;
- }
-}
-
static SystemWindow *ImplGetLastSystemWindow( Window *pWin )
{
// get the most top-level system window, the one that contains the taskpanelist
@@ -4663,154 +3501,6 @@ void Window::Scroll( long nHorzScroll, long nVertScroll,
ImplScroll( aRect, nHorzScroll, nVertScroll, nFlags );
}
-void Window::Invalidate( sal_uInt16 nFlags )
-{
-
- if ( !IsDeviceOutputNecessary() || !mnOutWidth || !mnOutHeight )
- return;
-
- ImplInvalidate( NULL, nFlags );
-}
-
-void Window::Invalidate( const Rectangle& rRect, sal_uInt16 nFlags )
-{
-
- if ( !IsDeviceOutputNecessary() || !mnOutWidth || !mnOutHeight )
- return;
-
- OutputDevice *pOutDev = GetOutDev();
- Rectangle aRect = pOutDev->ImplLogicToDevicePixel( rRect );
- if ( !aRect.IsEmpty() )
- {
- Region aRegion( aRect );
- ImplInvalidate( &aRegion, nFlags );
- }
-}
-
-void Window::Invalidate( const Region& rRegion, sal_uInt16 nFlags )
-{
-
- if ( !IsDeviceOutputNecessary() || !mnOutWidth || !mnOutHeight )
- return;
-
- if ( rRegion.IsNull() )
- ImplInvalidate( NULL, nFlags );
- else
- {
- Region aRegion = ImplPixelToDevicePixel( LogicToPixel( rRegion ) );
- if ( !aRegion.IsEmpty() )
- ImplInvalidate( &aRegion, nFlags );
- }
-}
-
-void Window::Validate( sal_uInt16 nFlags )
-{
-
- if ( !IsDeviceOutputNecessary() || !mnOutWidth || !mnOutHeight )
- return;
-
- ImplValidate( NULL, nFlags );
-}
-
-bool Window::HasPaintEvent() const
-{
-
- if ( !mpWindowImpl->mbReallyVisible )
- return false;
-
- if ( mpWindowImpl->mpFrameWindow->mpWindowImpl->mbPaintFrame )
- return true;
-
- if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINT )
- return true;
-
- if ( !ImplIsOverlapWindow() )
- {
- const Window* pTempWindow = this;
- do
- {
- pTempWindow = pTempWindow->ImplGetParent();
- if ( pTempWindow->mpWindowImpl->mnPaintFlags & (IMPL_PAINT_PAINTCHILDREN | IMPL_PAINT_PAINTALLCHILDREN) )
- return true;
- }
- while ( !pTempWindow->ImplIsOverlapWindow() );
- }
-
- return false;
-}
-
-void Window::Update()
-{
-
- if ( mpWindowImpl->mpBorderWindow )
- {
- mpWindowImpl->mpBorderWindow->Update();
- return;
- }
-
- if ( !mpWindowImpl->mbReallyVisible )
- return;
-
- bool bFlush = false;
- if ( mpWindowImpl->mpFrameWindow->mpWindowImpl->mbPaintFrame )
- {
- Point aPoint( 0, 0 );
- Region aRegion( Rectangle( aPoint, Size( mnOutWidth, mnOutHeight ) ) );
- ImplInvalidateOverlapFrameRegion( aRegion );
- if ( mpWindowImpl->mbFrame || (mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame) )
- bFlush = true;
- }
-
- // First we should skip all windows which are Paint-Transparent
- Window* pUpdateWindow = this;
- Window* pWindow = pUpdateWindow;
- while ( !pWindow->ImplIsOverlapWindow() )
- {
- if ( !pWindow->mpWindowImpl->mbPaintTransparent )
- {
- pUpdateWindow = pWindow;
- break;
- }
- pWindow = pWindow->ImplGetParent();
- }
- // In order to limit drawing, an update only draws the window which
- // has PAINTALLCHILDREN set
- pWindow = pUpdateWindow;
- do
- {
- if ( pWindow->mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALLCHILDREN )
- pUpdateWindow = pWindow;
- if ( pWindow->ImplIsOverlapWindow() )
- break;
- pWindow = pWindow->ImplGetParent();
- }
- while ( pWindow );
-
- // if there is something to paint, trigger a Paint
- if ( pUpdateWindow->mpWindowImpl->mnPaintFlags & (IMPL_PAINT_PAINT | IMPL_PAINT_PAINTCHILDREN) )
- {
- ImplDelData aDogTag(this);
-
- // trigger an update also for system windows on top of us,
- // otherwise holes would remain
- Window* pUpdateOverlapWindow = ImplGetFirstOverlapWindow()->mpWindowImpl->mpFirstOverlap;
- while ( pUpdateOverlapWindow )
- {
- pUpdateOverlapWindow->Update();
- pUpdateOverlapWindow = pUpdateOverlapWindow->mpWindowImpl->mpNext;
- }
-
- pUpdateWindow->ImplCallPaint( NULL, pUpdateWindow->mpWindowImpl->mnPaintFlags );
-
- if (aDogTag.IsDead())
- return;
- bFlush = true;
- }
-
- if ( bFlush )
- Flush();
-}
-
void Window::Flush()
{
@@ -4882,6 +3572,7 @@ bool Window::HasChildPathFocus( bool bSystemWindow ) const
return ImplIsWindowOrChild( pFocusWin, bSystemWindow );
return false;
}
+
void Window::SetCursor( Cursor* pCursor )
{
@@ -5756,162 +4447,6 @@ uno::Reference< rendering::XSpriteCanvas > Window::GetSpriteCanvas() const
return xSpriteCanvas;
}
-void Window::ImplPaintToDevice( OutputDevice* i_pTargetOutDev, const Point& i_rPos )
-{
- bool bRVisible = mpWindowImpl->mbReallyVisible;
- mpWindowImpl->mbReallyVisible = mpWindowImpl->mbVisible;
- bool bDevOutput = mbDevOutput;
- mbDevOutput = true;
-
- const OutputDevice *pOutDev = GetOutDev();
- long nOldDPIX = pOutDev->GetDPIX();
- long nOldDPIY = pOutDev->GetDPIY();
- mnDPIX = i_pTargetOutDev->GetDPIX();
- mnDPIY = i_pTargetOutDev->GetDPIY();
- bool bOutput = IsOutputEnabled();
- EnableOutput();
-
- DBG_ASSERT( GetMapMode().GetMapUnit() == MAP_PIXEL, "MapMode must be PIXEL based" );
- if ( GetMapMode().GetMapUnit() != MAP_PIXEL )
- return;
-
- // preserve graphicsstate
- Push();
- Region aClipRegion( GetClipRegion() );
- SetClipRegion();
-
- GDIMetaFile* pOldMtf = GetConnectMetaFile();
- GDIMetaFile aMtf;
- SetConnectMetaFile( &aMtf );
-
- // put a push action to metafile
- Push();
- // copy graphics state to metafile
- Font aCopyFont = GetFont();
- if( nOldDPIX != mnDPIX || nOldDPIY != mnDPIY )
- {
- aCopyFont.SetHeight( aCopyFont.GetHeight() * mnDPIY / nOldDPIY );
- aCopyFont.SetWidth( aCopyFont.GetWidth() * mnDPIX / nOldDPIX );
- }
- SetFont( aCopyFont );
- SetTextColor( GetTextColor() );
- if( IsLineColor() )
- SetLineColor( GetLineColor() );
- else
- SetLineColor();
- if( IsFillColor() )
- SetFillColor( GetFillColor() );
- else
- SetFillColor();
- if( IsTextLineColor() )
- SetTextLineColor( GetTextLineColor() );
- else
- SetTextLineColor();
- if( IsOverlineColor() )
- SetOverlineColor( GetOverlineColor() );
- else
- SetOverlineColor();
- if( IsTextFillColor() )
- SetTextFillColor( GetTextFillColor() );
- else
- SetTextFillColor();
- SetTextAlign( GetTextAlign() );
- SetRasterOp( GetRasterOp() );
- if( IsRefPoint() )
- SetRefPoint( GetRefPoint() );
- else
- SetRefPoint();
- SetLayoutMode( GetLayoutMode() );
- SetDigitLanguage( GetDigitLanguage() );
- Rectangle aPaintRect( Point( 0, 0 ), GetOutputSizePixel() );
- aClipRegion.Intersect( aPaintRect );
- SetClipRegion( aClipRegion );
-
- // do the actual paint
-
- // background
- if( ! IsPaintTransparent() && IsBackground() && ! (GetParentClipMode() & PARENTCLIPMODE_NOCLIP ) )
- Erase();
- // foreground
- Paint( aPaintRect );
- // put a pop action to metafile
- Pop();
-
- SetConnectMetaFile( pOldMtf );
- EnableOutput( bOutput );
- mpWindowImpl->mbReallyVisible = bRVisible;
-
- // paint metafile to VDev
- VirtualDevice* pMaskedDevice = new VirtualDevice( *i_pTargetOutDev, 0, 0 );
- pMaskedDevice->SetOutputSizePixel( GetOutputSizePixel() );
- pMaskedDevice->EnableRTL( IsRTLEnabled() );
- aMtf.WindStart();
- aMtf.Play( pMaskedDevice );
- BitmapEx aBmpEx( pMaskedDevice->GetBitmapEx( Point( 0, 0 ), pMaskedDevice->GetOutputSizePixel() ) );
- i_pTargetOutDev->DrawBitmapEx( i_rPos, aBmpEx );
- // get rid of virtual device now so they don't pile up during recursive calls
- delete pMaskedDevice, pMaskedDevice = NULL;
-
- for( Window* pChild = mpWindowImpl->mpFirstChild; pChild; pChild = pChild->mpWindowImpl->mpNext )
- {
- if( pChild->mpWindowImpl->mpFrame == mpWindowImpl->mpFrame && pChild->IsVisible() )
- {
- long nDeltaX = pChild->mnOutOffX - mnOutOffX;
-
- if( pOutDev->HasMirroredGraphics() )
- nDeltaX = mnOutWidth - nDeltaX - pChild->mnOutWidth;
- long nDeltaY = pChild->GetOutOffYPixel() - GetOutOffYPixel();
- Point aPos( i_rPos );
- Point aDelta( nDeltaX, nDeltaY );
- aPos += aDelta;
- pChild->ImplPaintToDevice( i_pTargetOutDev, aPos );
- }
- }
-
- // restore graphics state
- Pop();
-
- EnableOutput( bOutput );
- mpWindowImpl->mbReallyVisible = bRVisible;
- mbDevOutput = bDevOutput;
- mnDPIX = nOldDPIX;
- mnDPIY = nOldDPIY;
-}
-
-void Window::PaintToDevice( OutputDevice* pDev, const Point& rPos, const Size& /*rSize*/ )
-{
- // FIXME: scaling: currently this is for pixel copying only
-
- DBG_ASSERT( ! pDev->HasMirroredGraphics(), "PaintToDevice to mirroring graphics" );
- DBG_ASSERT( ! pDev->IsRTLEnabled(), "PaintToDevice to mirroring device" );
-
- Window* pRealParent = NULL;
- if( ! mpWindowImpl->mbVisible )
- {
- Window* pTempParent = ImplGetDefaultWindow();
- if( pTempParent )
- pTempParent->EnableChildTransparentMode();
- pRealParent = GetParent();
- SetParent( pTempParent );
- // trigger correct visibility flags for children
- Show();
- Hide();
- }
-
- bool bVisible = mpWindowImpl->mbVisible;
- mpWindowImpl->mbVisible = true;
-
- if( mpWindowImpl->mpBorderWindow )
- mpWindowImpl->mpBorderWindow->ImplPaintToDevice( pDev, rPos );
- else
- ImplPaintToDevice( pDev, rPos );
-
- mpWindowImpl->mbVisible = bVisible;
-
- if( pRealParent )
- SetParent( pRealParent );
-}
-
OUString Window::GetSurroundingText() const
{
return OUString();
@@ -5969,38 +4504,4 @@ void Window::DrawGradientWallpaper( long nX, long nY,
mpMetaFile = pOldMetaFile;
}
-void Window::Erase()
-{
- if ( !IsDeviceOutputNecessary() || ImplIsRecordLayout() )
- return;
-
- bool bNativeOK = false;
-
- ControlPart aCtrlPart = ImplGetWindowImpl()->mnNativeBackground;
- if( aCtrlPart != 0 && ! IsControlBackground() )
- {
- Rectangle aCtrlRegion( Point(), GetOutputSizePixel() );
- ControlState nState = 0;
-
- if( IsEnabled() )
- nState |= CTRL_STATE_ENABLED;
-
- bNativeOK = DrawNativeControl( CTRL_WINDOW_BACKGROUND, aCtrlPart, aCtrlRegion,
- nState, ImplControlValue(), OUString() );
- }
-
- if ( mbBackground && ! bNativeOK )
- {
- RasterOp eRasterOp = GetRasterOp();
- if ( eRasterOp != ROP_OVERPAINT )
- SetRasterOp( ROP_OVERPAINT );
- DrawWallpaper( 0, 0, mnOutWidth, mnOutHeight, maBackground );
- if ( eRasterOp != ROP_OVERPAINT )
- SetRasterOp( eRasterOp );
- }
-
- if( mpAlphaVDev )
- mpAlphaVDev->Erase();
-}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list