refactor "TextEdit" & co. to use RenderContext

Change-Id: Ib26ecb9640d23714acec73304f26e2fd6af90ed4
diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx
index 06c7573..e4ae127 100644
--- a/basctl/source/basicide/baside2b.cxx
+++ b/basctl/source/basicide/baside2b.cxx
@@ -915,12 +915,12 @@ void EditorWindow::SetupAndShowCodeCompleteWnd( const std::vector< OUString >& a
    pEditView->GetWindow()->GrabFocus();
}

void EditorWindow::Paint( vcl::RenderContext& /*rRenderContext*/, const Rectangle& rRect )
void EditorWindow::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect)
{
    if ( !pEditEngine )     // We need it now at latest
    if (!pEditEngine)     // We need it now at latest
        CreateEditEngine();

    pEditView->Paint( rRect );
    pEditView->Paint(rRenderContext, rRect);
}

void EditorWindow::LoseFocus()
diff --git a/include/vcl/textview.hxx b/include/vcl/textview.hxx
index baf97a9..721c0c0 100644
--- a/include/vcl/textview.hxx
+++ b/include/vcl/textview.hxx
@@ -25,10 +25,11 @@
#include <vcl/dllapi.h>
#include <vcl/dndhelp.hxx>
#include <vcl/textdata.hxx>
#include <vcl/window.hxx>

class TextEngine;
class OutputDevice;
namespace vcl { class Window; }

class KeyEvent;
class MouseEvent;
class CommandEvent;
@@ -37,11 +38,7 @@ class SelectionEngine;
class VirtualDevice;
struct TextDDInfo;

namespace com {
namespace sun {
namespace star {
namespace datatransfer {
namespace clipboard {
namespace com { namespace sun { namespace star { namespace datatransfer { namespace clipboard {
    class XClipboard;
}}}}}

@@ -72,8 +69,8 @@ protected:
    void                ImpSetSelection( const TextSelection& rNewSel, bool bUI );
    bool                IsInSelection( const TextPaM& rPaM );

    void                ImpPaint( OutputDevice* pOut, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange = 0, TextSelection const* pSelection = 0 );
    void                ImpPaint( const Rectangle& rRect, bool bUseVirtDev );
    void                ImpPaint(vcl::RenderContext& rRenderContext, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange = 0, TextSelection const* pSelection = 0);
    void                ImpPaint(vcl::RenderContext& rRenderContext, const Rectangle& rRect, bool bUseVirtDev);
    void                ImpShowCursor( bool bGotoCursor, bool bForceVisCursor, bool bEndKey );
    void                ImpHighlight( const TextSelection& rSel );
    void                ImpSetSelection( const TextSelection& rSelection );
@@ -127,8 +124,8 @@ public:

    void                InsertText( const OUString& rNew, bool bSelect = false );

    bool            KeyInput( const KeyEvent& rKeyEvent );
    void                Paint( const Rectangle& rRect );
    bool                KeyInput( const KeyEvent& rKeyEvent );
    void                Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect);
    void                MouseButtonUp( const MouseEvent& rMouseEvent );
    void                MouseButtonDown( const MouseEvent& rMouseEvent );
    void                MouseMove( const MouseEvent& rMouseEvent );
diff --git a/sw/source/uibase/docvw/srcedtw.cxx b/sw/source/uibase/docvw/srcedtw.cxx
index 9f9bc20..695019e 100644
--- a/sw/source/uibase/docvw/srcedtw.cxx
+++ b/sw/source/uibase/docvw/srcedtw.cxx
@@ -478,9 +478,9 @@ void  TextViewOutWin::KeyInput( const KeyEvent& rKEvt )
    }
}

void  TextViewOutWin::Paint( vcl::RenderContext& /*rRenderContext*/, const Rectangle& rRect )
void TextViewOutWin::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect)
{
    pTextView->Paint( rRect );
    pTextView->Paint(rRenderContext, rRect);
}

void SwSrcEditWindow::CreateTextEngine()
diff --git a/vcl/source/edit/texteng.cxx b/vcl/source/edit/texteng.cxx
index e5a3c84..7311148 100644
--- a/vcl/source/edit/texteng.cxx
+++ b/vcl/source/edit/texteng.cxx
@@ -1499,10 +1499,7 @@ void TextEngine::UpdateViews( TextView* pCurView )
                aNewPos.X() -= aOutSz.Width() - 1;
            aClipRect.SetPos( aNewPos );

            if ( pView == pCurView )
                pView->ImpPaint( aClipRect, !pView->GetWindow()->IsPaintTransparent() );
            else
                pView->GetWindow()->Invalidate( aClipRect );
            pView->GetWindow()->Invalidate( aClipRect );
        }
    }

diff --git a/vcl/source/edit/textview.cxx b/vcl/source/edit/textview.cxx
index 2dd8da9..bd0ccc9 100644
--- a/vcl/source/edit/textview.cxx
+++ b/vcl/source/edit/textview.cxx
@@ -293,99 +293,97 @@ void TextView::DeleteSelected()
    ShowCursor();
}

void TextView::ImpPaint( OutputDevice* pOut, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange, TextSelection const* pSelection )
void TextView::ImpPaint(vcl::RenderContext& rRenderContext, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange, TextSelection const* pSelection)
{
    if ( !mpImpl->mbPaintSelection )
    if (!mpImpl->mbPaintSelection)
    {
        pSelection = NULL;
    }
    else
    {
        // set correct background color;
        // unfortunately we cannot detect if it has changed
        vcl::Font aFont = mpImpl->mpTextEngine->GetFont();
        Color aColor = pOut->GetBackground().GetColor();
        aColor.SetTransparency( 0 );
        if ( aColor != aFont.GetFillColor() )
        Color aColor = rRenderContext.GetBackground().GetColor();
        aColor.SetTransparency(0);
        if (aColor != aFont.GetFillColor())
        {
            if( aFont.IsTransparent() )
                aColor = Color( COL_TRANSPARENT );
            aFont.SetFillColor( aColor );
            if (aFont.IsTransparent())
                aColor = Color(COL_TRANSPARENT);
            aFont.SetFillColor(aColor);
            mpImpl->mpTextEngine->maFont = aFont;
        }
    }

    mpImpl->mpTextEngine->ImpPaint( pOut, rStartPos, pPaintArea, pPaintRange, pSelection );
    mpImpl->mpTextEngine->ImpPaint(&rRenderContext, rStartPos, pPaintArea, pPaintRange, pSelection);
}

void TextView::Paint( const Rectangle& rRect )
void TextView::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect)
{
    ImpPaint( rRect, false );
    ImpPaint(rRenderContext, rRect, false);
}

void TextView::ImpPaint( const Rectangle& rRect, bool bUseVirtDev )
void TextView::ImpPaint(vcl::RenderContext& rRenderContext, const Rectangle& rRect, bool bUseVirtDev)
{
    if ( !mpImpl->mpTextEngine->GetUpdateMode() || mpImpl->mpTextEngine->IsInUndo() )
        return;

    TextSelection *pDrawSelection = NULL;
    if ( !mpImpl->mbHighlightSelection && mpImpl->maSelection.HasRange() )
    if (!mpImpl->mbHighlightSelection && mpImpl->maSelection.HasRange())
        pDrawSelection = &mpImpl->maSelection;

    if ( bUseVirtDev )
    if (bUseVirtDev)
    {
        VirtualDevice* pVDev = GetVirtualDevice();

        const Color& rBackgroundColor = mpImpl->mpWindow->GetBackground().GetColor();
        if ( pVDev->GetFillColor() != rBackgroundColor )
        if (pVDev->GetFillColor() != rBackgroundColor)
            pVDev->SetFillColor( rBackgroundColor );
        if ( pVDev->GetBackground().GetColor() != rBackgroundColor )
        if (pVDev->GetBackground().GetColor() != rBackgroundColor)
            pVDev->SetBackground( rBackgroundColor );

        bool bVDevValid = true;
        Size aOutSz( pVDev->GetOutputSizePixel() );
        if ( (  aOutSz.Width() < rRect.GetWidth() ) ||
             (  aOutSz.Height() < rRect.GetHeight() ) )
        Size aOutSz(pVDev->GetOutputSizePixel());
        if ((aOutSz.Width() < rRect.GetWidth()) ||
            (aOutSz.Height() < rRect.GetHeight()))
        {
            bVDevValid = pVDev->SetOutputSizePixel( rRect.GetSize() );
            bVDevValid = pVDev->SetOutputSizePixel(rRect.GetSize());
        }
        else
        {
            // the VirtDev can get very large on Resize =>
            // shrink now and then
            if ( ( aOutSz.Height() > ( rRect.GetHeight() + 20 ) ) ||
                 ( aOutSz.Width() > ( rRect.GetWidth() + 20 ) ) )
            if ((aOutSz.Height() > (rRect.GetHeight() + 20)) ||
                (aOutSz.Width() > (rRect.GetWidth() + 20)))
            {
                bVDevValid = pVDev->SetOutputSizePixel( rRect.GetSize() );
                bVDevValid = pVDev->SetOutputSizePixel(rRect.GetSize());
            }
            else
            {
                pVDev->Erase();
            }
        }
        if ( !bVDevValid )
        if (!bVDevValid)
        {
            ImpPaint( rRect, false /* without VDev */ );
            ImpPaint(rRenderContext, rRect, false);
            return;
        }

        Rectangle aTmpRect( Point( 0, 0 ), rRect.GetSize() );
        Rectangle aTmpRect(Point(0, 0), rRect.GetSize());

        Point aDocPos( mpImpl->maStartDocPos.X(), mpImpl->maStartDocPos.Y() + rRect.Top() );
        Point aStartPos = ImpGetOutputStartPos( aDocPos );
        ImpPaint( pVDev, aStartPos, &aTmpRect, NULL, pDrawSelection );
        mpImpl->mpWindow->DrawOutDev( rRect.TopLeft(), rRect.GetSize(),
                                Point(0,0), rRect.GetSize(), *pVDev );
//      ShowSelection();
        if ( mpImpl->mbHighlightSelection )
            ImpHighlight( mpImpl->maSelection );
        Point aDocPos(mpImpl->maStartDocPos.X(), mpImpl->maStartDocPos.Y() + rRect.Top());
        Point aStartPos = ImpGetOutputStartPos(aDocPos);
        ImpPaint(*pVDev, aStartPos, &aTmpRect, NULL, pDrawSelection);
        rRenderContext.DrawOutDev(rRect.TopLeft(), rRect.GetSize(), Point(0,0), rRect.GetSize(), *pVDev);
        if (mpImpl->mbHighlightSelection)
            ImpHighlight(mpImpl->maSelection);
    }
    else
    {
        Point aStartPos = ImpGetOutputStartPos( mpImpl->maStartDocPos );
        ImpPaint( mpImpl->mpWindow, aStartPos, &rRect, NULL, pDrawSelection );

//      ShowSelection();
        if ( mpImpl->mbHighlightSelection )
            ImpHighlight( mpImpl->maSelection );
        Point aStartPos = ImpGetOutputStartPos(mpImpl->maStartDocPos);
        ImpPaint(rRenderContext, aStartPos, &rRect, NULL, pDrawSelection);
        if (mpImpl->mbHighlightSelection)
            ImpHighlight(mpImpl->maSelection);
    }
}

@@ -499,7 +497,7 @@ void TextView::ShowSelection( const TextSelection& rRange )
    ImpShowHideSelection( true, &rRange );
}

void TextView::ImpShowHideSelection( bool bShow, const TextSelection* pRange )
void TextView::ImpShowHideSelection(bool /*bShow*/, const TextSelection* pRange)
{
    const TextSelection* pRangeOrSelection = pRange ? pRange : &mpImpl->maSelection;

@@ -515,14 +513,12 @@ void TextView::ImpShowHideSelection( bool bShow, const TextSelection* pRange )
                mpImpl->mpWindow->Invalidate();
            else
            {
                Rectangle aOutArea( Point( 0, 0 ), mpImpl->mpWindow->GetOutputSizePixel() );
                Point aStartPos( ImpGetOutputStartPos( mpImpl->maStartDocPos ) );
                TextSelection aRange( *pRangeOrSelection );
                aRange.Justify();
                bool bVisCursor = mpImpl->mpCursor->IsVisible();
                mpImpl->mpCursor->Hide();
                ImpPaint( mpImpl->mpWindow, aStartPos, &aOutArea, &aRange, bShow ? &mpImpl->maSelection : NULL );
                if ( bVisCursor )
                Invalidate();
                if (bVisCursor)
                    mpImpl->mpCursor->Show();
            }
        }
diff --git a/vcl/source/edit/vclmedit.cxx b/vcl/source/edit/vclmedit.cxx
index c04606f..46c7c90 100644
--- a/vcl/source/edit/vclmedit.cxx
+++ b/vcl/source/edit/vclmedit.cxx
@@ -60,7 +60,7 @@ public:

    virtual void    Command( const CommandEvent& rCEvt ) SAL_OVERRIDE;

    virtual void    Paint( vcl::RenderContext& /*rRenderContext*/, const Rectangle& rRect ) SAL_OVERRIDE;
    virtual void    Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) SAL_OVERRIDE;
    virtual void    Resize() SAL_OVERRIDE;

    virtual void    GetFocus() SAL_OVERRIDE;
@@ -807,9 +807,9 @@ void TextWindow::KeyInput( const KeyEvent& rKEvent )
        Window::KeyInput( rKEvent );
}

void TextWindow::Paint( vcl::RenderContext& /*rRenderContext*/, const Rectangle& rRect )
void TextWindow::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect)
{
    mpExtTextView->Paint( rRect );
    mpExtTextView->Paint(rRenderContext, rRect);
}

void TextWindow::Resize()