From 3a87fb18241e803f7ebffedfc59648782f560f4e Mon Sep 17 00:00:00 2001
From: Caolán McNamara <caolanm@redhat.com>
Date: Mon, 17 Sep 2018 16:53:23 +0100
Subject: weld GraphicFilterEmboss
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Change-Id: Ic3c816ddd7d5df9c5ced14600fffd6ca59f0096e
Reviewed-on: https://gerrit.libreoffice.org/60594
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
---
 cui/source/dialogs/cuigrfflt.cxx | 163 ++++++++++++++++++++++++++++++++-------
 1 file changed, 135 insertions(+), 28 deletions(-)

(limited to 'cui/source/dialogs')

diff --git a/cui/source/dialogs/cuigrfflt.cxx b/cui/source/dialogs/cuigrfflt.cxx
index e9f84d1789ef..f8f2b76bc4a5 100644
--- a/cui/source/dialogs/cuigrfflt.cxx
+++ b/cui/source/dialogs/cuigrfflt.cxx
@@ -79,7 +79,6 @@ void GraphicPreviewWindow::SetPreview(const Graphic& rGraphic)
     Invalidate();
 }
 
-
 void GraphicPreviewWindow::ScaleImageToFit()
 {
     if (!mpOrigGraphic)
@@ -125,13 +124,105 @@ void GraphicPreviewWindow::ScaleImageToFit()
     maModifyHdl.Call(nullptr);
 }
 
-
 void GraphicPreviewWindow::Resize()
 {
     Control::Resize();
     ScaleImageToFit();
 }
 
+CuiGraphicPreviewWindow::CuiGraphicPreviewWindow()
+    : mpOrigGraphic(nullptr)
+    , mfScaleX(0.0)
+    , mfScaleY(0.0)
+{
+}
+
+void CuiGraphicPreviewWindow::SetDrawingArea(weld::DrawingArea* pDrawingArea)
+{
+    CustomWidgetController::SetDrawingArea(pDrawingArea);
+    OutputDevice &rDevice = pDrawingArea->get_ref_device();
+    maOutputSizePixel = rDevice.LogicToPixel(Size(81, 73), MapMode(MapUnit::MapAppFont));
+    pDrawingArea->set_size_request(maOutputSizePixel.Width(), maOutputSizePixel.Height());
+}
+
+void CuiGraphicPreviewWindow::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&)
+{
+    rRenderContext.SetBackground(Wallpaper(Application::GetSettings().GetStyleSettings().GetDialogColor()));
+    rRenderContext.Erase();
+
+    const Size aOutputSize(GetOutputSizePixel());
+
+    if (maPreview.IsAnimated())
+    {
+        const Size aGraphicSize(rRenderContext.LogicToPixel(maPreview.GetPrefSize(), maPreview.GetPrefMapMode()));
+        const Point aGraphicPosition((aOutputSize.Width()  - aGraphicSize.Width()  ) >> 1,
+                                     (aOutputSize.Height() - aGraphicSize.Height() ) >> 1);
+        maPreview.StartAnimation(&rRenderContext, aGraphicPosition, aGraphicSize);
+    }
+    else
+    {
+        const Size  aGraphicSize(maPreview.GetSizePixel());
+        const Point aGraphicPosition((aOutputSize.Width()  - aGraphicSize.Width())  >> 1,
+                                     (aOutputSize.Height() - aGraphicSize.Height()) >> 1);
+        maPreview.Draw(&rRenderContext, aGraphicPosition, aGraphicSize);
+    }
+}
+
+void CuiGraphicPreviewWindow::SetPreview(const Graphic& rGraphic)
+{
+    maPreview = rGraphic;
+    Invalidate();
+}
+
+void CuiGraphicPreviewWindow::ScaleImageToFit()
+{
+    if (!mpOrigGraphic)
+        return;
+
+    maScaledOrig = *mpOrigGraphic;
+
+    const Size aPreviewSize(GetOutputSizePixel());
+    Size aGrfSize(maOrigGraphicSizePixel);
+
+    if( mpOrigGraphic->GetType() == GraphicType::Bitmap &&
+        aPreviewSize.Width() && aPreviewSize.Height() &&
+        aGrfSize.Width() && aGrfSize.Height() )
+    {
+        const double fGrfWH = static_cast<double>(aGrfSize.Width()) / aGrfSize.Height();
+        const double fPreWH = static_cast<double>(aPreviewSize.Width()) / aPreviewSize.Height();
+
+        if( fGrfWH < fPreWH )
+        {
+            aGrfSize.setWidth( static_cast<long>( aPreviewSize.Height() * fGrfWH ) );
+            aGrfSize.setHeight( aPreviewSize.Height() );
+        }
+        else
+        {
+            aGrfSize.setWidth( aPreviewSize.Width() );
+            aGrfSize.setHeight( static_cast<long>( aPreviewSize.Width() / fGrfWH ) );
+        }
+
+        mfScaleX = static_cast<double>(aGrfSize.Width()) / maOrigGraphicSizePixel.Width();
+        mfScaleY = static_cast<double>(aGrfSize.Height()) / maOrigGraphicSizePixel.Height();
+
+        if( !mpOrigGraphic->IsAnimated() )
+        {
+            BitmapEx aBmpEx( mpOrigGraphic->GetBitmapEx() );
+
+            if( aBmpEx.Scale( aGrfSize ) )
+                maScaledOrig = aBmpEx;
+        }
+    }
+
+    maModifyHdl.Call(nullptr);
+}
+
+void CuiGraphicPreviewWindow::Resize()
+{
+    maOutputSizePixel = GetOutputSizePixel();
+    ScaleImageToFit();
+}
+
 GraphicFilterDialog::GraphicFilterDialog(vcl::Window* pParent,
     const OUString& rID, const OUString& rUIXMLDescription,
     const Graphic& rGraphic)
@@ -180,6 +271,36 @@ IMPL_LINK_NOARG(GraphicFilterDialog, ImplModifyHdl, LinkParamNone*, void)
     }
 }
 
+GraphicFilterDialogController::GraphicFilterDialogController(weld::Window* pParent,
+    const OUString& rUIXMLDescription, const OString& rID,
+    const Graphic& rGraphic)
+    : GenericDialogController(pParent, rUIXMLDescription, rID)
+    , maModifyHdl(LINK(this, GraphicFilterDialogController, ImplModifyHdl))
+    , mxPreview(new weld::CustomWeld(*m_xBuilder, "preview", maPreview))
+{
+    bIsBitmap = rGraphic.GetType() == GraphicType::Bitmap;
+
+    maTimer.SetInvokeHandler(LINK(this, GraphicFilterDialogController, ImplPreviewTimeoutHdl));
+    maTimer.SetTimeout(5);
+
+    maPreview.init(&rGraphic, maModifyHdl);
+}
+
+IMPL_LINK_NOARG(GraphicFilterDialogController, ImplPreviewTimeoutHdl, Timer *, void)
+{
+    maTimer.Stop();
+    maPreview.SetPreview(GetFilteredGraphic(maPreview.GetScaledOriginal(),
+        maPreview.GetScaleX(), maPreview.GetScaleY()));
+}
+
+IMPL_LINK_NOARG(GraphicFilterDialogController, ImplModifyHdl, LinkParamNone*, void)
+{
+    if (bIsBitmap)
+    {
+        maTimer.Stop();
+        maTimer.Start();
+    }
+}
 
 GraphicFilterMosaic::GraphicFilterMosaic( vcl::Window* pParent, const Graphic& rGraphic,
                                           sal_uInt16 nTileWidth, sal_uInt16 nTileHeight, bool bEnhanceEdges )
@@ -517,53 +638,39 @@ void EmbossControl::MouseButtonDown( const MouseEvent& rEvt )
 {
     const RectPoint eOldRP = GetActualRP();
 
-    SvxRectCtl::MouseButtonDown( rEvt );
+    RectCtl::MouseButtonDown( rEvt );
 
     if( GetActualRP() != eOldRP )
         maModifyHdl.Call( nullptr );
 }
 
-
-Size EmbossControl::GetOptimalSize() const
+void EmbossControl::SetDrawingArea(weld::DrawingArea* pDrawingArea)
 {
-    return LogicToPixel(Size(77, 60), MapMode(MapUnit::MapAppFont));
+    RectCtl::SetDrawingArea(pDrawingArea);
+    Size aSize(pDrawingArea->get_ref_device().LogicToPixel(Size(77, 60), MapMode(MapUnit::MapAppFont)));
+    pDrawingArea->set_size_request(aSize.Width(), aSize.Height());
 }
 
-
-VCL_BUILDER_FACTORY(EmbossControl)
-
-
-GraphicFilterEmboss::GraphicFilterEmboss(vcl::Window* pParent,
+GraphicFilterEmboss::GraphicFilterEmboss(weld::Window* pParent,
     const Graphic& rGraphic, RectPoint eLightSource)
-    : GraphicFilterDialog (pParent, "EmbossDialog",
-        "cui/ui/embossdialog.ui", rGraphic)
+    : GraphicFilterDialogController(pParent, "cui/ui/embossdialog.ui", "EmbossDialog", rGraphic)
+    , mxCtlLight(new weld::CustomWeld(*m_xBuilder, "lightsource", maCtlLight))
 {
-    get(mpCtlLight, "lightsource");
-    mpCtlLight->SetActualRP(eLightSource);
-    mpCtlLight->SetModifyHdl( GetModifyHdl() );
-    mpCtlLight->GrabFocus();
+    maCtlLight.SetActualRP(eLightSource);
+    maCtlLight.SetModifyHdl( GetModifyHdl() );
+    maCtlLight.GrabFocus();
 }
 
-
 GraphicFilterEmboss::~GraphicFilterEmboss()
 {
-    disposeOnce();
 }
 
-
-void GraphicFilterEmboss::dispose()
-{
-    mpCtlLight.clear();
-    GraphicFilterDialog::dispose();
-}
-
-
 Graphic GraphicFilterEmboss::GetFilteredGraphic( const Graphic& rGraphic, double, double )
 {
     Graphic aRet;
     sal_uInt16  nAzim, nElev;
 
-    switch( mpCtlLight->GetActualRP() )
+    switch (maCtlLight.GetActualRP())
     {
         default:       OSL_FAIL("svx::GraphicFilterEmboss::GetFilteredGraphic(), unknown Reference Point!" );
                        SAL_FALLTHROUGH;
-- 
cgit