include/vcl/window.hxx | 4 sd/source/ui/accessibility/accessibility.src | 2 vcl/source/window/window.cxx | 297 ++++++++++++++++----------- 3 files changed, 182 insertions(+), 121 deletions(-)
New commits: commit e1f0d790832098a7f8b323ab04809b6b55ade3d9 Author: Caolán McNamara <caol...@redhat.com> Date: Tue May 13 14:03:51 2014 +0100 Sub Title -> Subtitle Change-Id: I1a0bcf7548699845752ac3cf49232655c2fb4fc0 diff --git a/sd/source/ui/accessibility/accessibility.src b/sd/source/ui/accessibility/accessibility.src index 0d22039..6d2572f 100644 --- a/sd/source/ui/accessibility/accessibility.src +++ b/sd/source/ui/accessibility/accessibility.src @@ -210,7 +210,7 @@ String SID_SD_A11Y_P_OUTLINER_N_STYLE String SID_SD_A11Y_P_SUBTITLE_N_STYLE { - Text [ en-US ] = "Sub Title"; + Text [ en-US ] = "Subtitle"; }; String SID_SD_A11Y_P_PAGE_N_STYLE commit c1c152f0e47407b2b327839e8b31601ea7423ddf Author: Caolán McNamara <caol...@redhat.com> Date: Mon May 12 21:41:35 2014 +0100 coverity#1213522 Uncaught exception and a gadzillion more refactor to avoid slicing catch and rethrow Change-Id: I5c05d1c151b81ff481eff8cd7544db9838143c71 diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx index 2fd43a1..b24e933 100644 --- a/include/vcl/window.hxx +++ b/include/vcl/window.hxx @@ -316,6 +316,7 @@ const char* ImplDbgCheckWindow( const void* pObj ); class Dialog; class WindowImpl; +class PaintHelper; class VclBuilder; class VclSizeGroup; @@ -343,6 +344,7 @@ class VCL_DLLPUBLIC Window : public OutputDevice, public Resource friend class SystemChildWindow; friend class ImplBorderWindow; friend class VclBuilder; + friend class PaintHelper; // TODO: improve missing functionality // only required because of SetFloatingMode() @@ -480,6 +482,8 @@ protected: SAL_DLLPRIVATE WindowResHeader ImplLoadResHeader( const ResId& rResId ); SAL_DLLPRIVATE void ImplLoadRes( const ResId& rResId ); + SAL_DLLPRIVATE void PushPaintHelper(PaintHelper *pHelper); + SAL_DLLPRIVATE void PopPaintHelper(PaintHelper *pHelper); private: SAL_DLLPRIVATE void ImplInitWindowData( WindowType nType ); diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index d958287..2291b7f 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -1914,162 +1914,219 @@ void Window::ImplCalcOverlapRegion( const Rectangle& rSourceRect, Region& rRegio } } -void Window::ImplCallPaint( const Region* pRegion, sal_uInt16 nPaintFlags ) +class PaintHelper { - Exception aException; - bool bExceptionCaught(false); - - // call PrePaint. PrePaint may add to the invalidate region as well as - // other parameters used below. - PrePaint(); - - mpWindowImpl->mbPaintFrame = false; +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(); +}; - 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; +PaintHelper::PaintHelper(Window *pWindow, sal_uInt16 nPaintFlags) + : m_pWindow(pWindow) + , m_pChildRegion(NULL) + , m_nPaintFlags(nPaintFlags) + , m_bPop(false) + , m_bRestoreCursor(false) +{ +} - if ( mpWindowImpl->mbPaintDisabled ) +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 ( 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; - } + if ( pRegion ) + pWindowImpl->maInvalidateRegion.Union( *pRegion ); - nPaintFlags = mpWindowImpl->mnPaintFlags & ~(IMPL_PAINT_PAINT); + 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 ); - Region* pChildRegion = NULL; - Rectangle aSelectionRect; - if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINT ) + if ( pWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALLCHILDREN ) + m_pChildRegion = new Region( pWindowImpl->maInvalidateRegion ); + pWindowImpl->maInvalidateRegion.Intersect( *pWinChildClipRegion ); + } + pWindowImpl->mnPaintFlags = 0; + if ( !pWindowImpl->maInvalidateRegion.IsEmpty() ) { - Region* pWinChildClipRegion = ImplGetWinChildClipRegion(); - if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL ) - mpWindowImpl->maInvalidateRegion = *pWinChildClipRegion; - else - { - if ( pRegion ) - mpWindowImpl->maInvalidateRegion.Union( *pRegion ); + m_pWindow->PushPaintHelper(this); + m_pWindow->Paint(m_aPaintRect); + } +} - if( mpWindowImpl->mpWinData && mpWindowImpl->mbTrackVisible ) - /* #98602# need to repaint all children within the - * tracking rectangle, so the following invert - * operation takes places without traces of the previous - * one. - */ - mpWindowImpl->maInvalidateRegion.Union( *mpWindowImpl->mpWinData->mpTrackRect ); +void Window::PushPaintHelper(PaintHelper *pHelper) +{ + pHelper->SetPop(); - if ( mpWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALLCHILDREN ) - pChildRegion = new Region( mpWindowImpl->maInvalidateRegion ); - mpWindowImpl->maInvalidateRegion.Intersect( *pWinChildClipRegion ); - } - mpWindowImpl->mnPaintFlags = 0; - if ( !mpWindowImpl->maInvalidateRegion.IsEmpty() ) - { - bool bRestoreCursor = false; - if ( mpWindowImpl->mpCursor ) - bRestoreCursor = mpWindowImpl->mpCursor->ImplSuspend(); + if ( mpWindowImpl->mpCursor ) + pHelper->SetRestoreCursor(mpWindowImpl->mpCursor->ImplSuspend()); - mbInitClipRegion = true; - mpWindowImpl->mbInPaint = true; + mbInitClipRegion = true; + mpWindowImpl->mbInPaint = true; - // restore Paint-Region - Region aPaintRegion( mpWindowImpl->maInvalidateRegion ); - Rectangle aPaintRect = aPaintRegion.GetBoundRect(); + // 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( aPaintRegion ); - } - aPaintRect = ImplDevicePixelToLogic( aPaintRect); - mpWindowImpl->mpPaintRegion = &aPaintRegion; - mpWindowImpl->maInvalidateRegion.SetEmpty(); + // - 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 ( (nPaintFlags & IMPL_PAINT_ERASE) && IsBackground() ) - { - if ( IsClipRegion() ) - { - Region aOldRegion = GetClipRegion(); - SetClipRegion(); - Erase(); - SetClipRegion( aOldRegion ); - } - else - Erase(); - } + 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 ) - aSelectionRect = aPaintRect; + // #98943# trigger drawing of toolbox selection after all childern are painted + if( mpWindowImpl->mbDrawSelectionBackground ) + pHelper->SetSelectionRect(aPaintRect); + pHelper->SetPaintRect(aPaintRect); +} - // Paint can throw exceptions; to not have a situation where - // mpWindowImpl->mbInPaint keeps to be on true (and other - // settings, too) better catch here to avoid to go completely out of - // this method without executing the after-paint stuff - try - { - Paint( aPaintRect ); - } - catch(Exception& rException) - { - aException = rException; - bExceptionCaught = true; - } +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()); +} - if ( mpWindowImpl->mpWinData ) - { - if ( mpWindowImpl->mbFocusVisible ) - ImplInvertFocus( *(mpWindowImpl->mpWinData->mpFocusRect) ); - } - mpWindowImpl->mbInPaint = false; - mbInitClipRegion = true; - mpWindowImpl->mpPaintRegion = NULL; - if ( mpWindowImpl->mpCursor ) - mpWindowImpl->mpCursor->ImplResume( bRestoreCursor ); - } +PaintHelper::~PaintHelper() +{ + WindowImpl* pWindowImpl = m_pWindow->ImplGetWindowImpl(); + if (m_bPop) + { + m_pWindow->PopPaintHelper(this); } - else - mpWindowImpl->mnPaintFlags = 0; - if ( nPaintFlags & (IMPL_PAINT_PAINTALLCHILDREN | IMPL_PAINT_PAINTCHILDREN) ) + if ( m_nPaintFlags & (IMPL_PAINT_PAINTALLCHILDREN | IMPL_PAINT_PAINTCHILDREN) ) { // Paint from the bottom child window and frontward. - Window* pTempWindow = mpWindowImpl->mpLastChild; + Window* pTempWindow = pWindowImpl->mpLastChild; while ( pTempWindow ) { if ( pTempWindow->mpWindowImpl->mbVisible ) - pTempWindow->ImplCallPaint( pChildRegion, nPaintFlags ); + pTempWindow->ImplCallPaint( m_pChildRegion, m_nPaintFlags ); pTempWindow = pTempWindow->mpWindowImpl->mpPrev; } } - if ( mpWindowImpl->mpWinData && mpWindowImpl->mbTrackVisible && (mpWindowImpl->mpWinData->mnTrackFlags & SHOWTRACK_WINDOW) ) + if ( pWindowImpl->mpWinData && pWindowImpl->mbTrackVisible && (pWindowImpl->mpWinData->mnTrackFlags & SHOWTRACK_WINDOW) ) /* #98602# need to invert the tracking rect AFTER * the children have painted */ - InvertTracking( *(mpWindowImpl->mpWinData->mpTrackRect), mpWindowImpl->mpWinData->mnTrackFlags ); + m_pWindow->InvertTracking( *(pWindowImpl->mpWinData->mpTrackRect), pWindowImpl->mpWinData->mnTrackFlags ); // #98943# draw toolbox selection - if( !aSelectionRect.IsEmpty() ) - DrawSelectionBackground( aSelectionRect, 3, false, true, false ); + if( !m_aSelectionRect.IsEmpty() ) + m_pWindow->DrawSelectionBackground( m_aSelectionRect, 3, false, true, false ); + + delete m_pChildRegion; +} - delete 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(bExceptionCaught) + 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 ) { - throw(aException); + 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()
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits