[Libreoffice-commits] core.git: solenv/clang-format starmath/inc starmath/Library_sm.mk starmath/source starmath/uiconfig starmath/UIConfig_smath.mk starmath/visual-editor-todo

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Wed Apr 21 16:02:58 UTC 2021


 solenv/clang-format/excludelist          |    2 
 starmath/Library_sm.mk                   |    1 
 starmath/UIConfig_smath.mk               |    1 
 starmath/inc/scrwin.hxx                  |   68 ----
 starmath/inc/view.hxx                    |  111 ++++---
 starmath/source/accessibility.cxx        |  203 ++++++-------
 starmath/source/accessibility.hxx        |    4 
 starmath/source/cursor.cxx               |    2 
 starmath/source/document.cxx             |   10 
 starmath/source/edit.cxx                 |    4 
 starmath/source/scrwin.cxx               |  345 ----------------------
 starmath/source/view.cxx                 |  483 ++++++++++++++++++++-----------
 starmath/uiconfig/smath/ui/mathwindow.ui |   38 ++
 starmath/visual-editor-todo              |    2 
 14 files changed, 549 insertions(+), 725 deletions(-)

New commits:
commit ea21b870f8549d0110ef65187af50694a06458ca
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Mon Apr 19 15:22:22 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Apr 21 18:02:15 2021 +0200

    weld SmGraphicWindow
    
    Change-Id: Ie163640d6453f30d1cebdaf75ecd41374b2b9ec3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114351
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist
index ae149d09096b..99d83dcc8730 100644
--- a/solenv/clang-format/excludelist
+++ b/solenv/clang-format/excludelist
@@ -10977,7 +10977,6 @@ starmath/inc/helpids.h
 starmath/inc/node.hxx
 starmath/inc/parse.hxx
 starmath/inc/rect.hxx
-starmath/inc/scrwin.hxx
 starmath/inc/smmod.hxx
 starmath/inc/symbol.hxx
 starmath/inc/unomodel.hxx
@@ -11009,7 +11008,6 @@ starmath/source/ooxmlimport.cxx
 starmath/source/ooxmlimport.hxx
 starmath/source/parse.cxx
 starmath/source/rect.cxx
-starmath/source/scrwin.cxx
 starmath/source/smdetect.cxx
 starmath/source/smdetect.hxx
 starmath/source/smdll.cxx
diff --git a/starmath/Library_sm.mk b/starmath/Library_sm.mk
index 2e3cc035ec5f..0c27c07bc2a4 100644
--- a/starmath/Library_sm.mk
+++ b/starmath/Library_sm.mk
@@ -84,7 +84,6 @@ $(eval $(call gb_Library_add_exception_objects,sm,\
         starmath/source/parse \
         starmath/source/parse5 \
         starmath/source/rect \
-        starmath/source/scrwin \
         starmath/source/smdll \
         starmath/source/smmod \
         starmath/source/symbol \
diff --git a/starmath/UIConfig_smath.mk b/starmath/UIConfig_smath.mk
index c24374206350..2a39af9e4a6d 100644
--- a/starmath/UIConfig_smath.mk
+++ b/starmath/UIConfig_smath.mk
@@ -36,6 +36,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/smath,\
 	starmath/uiconfig/smath/ui/fontdialog \
 	starmath/uiconfig/smath/ui/fontsizedialog \
 	starmath/uiconfig/smath/ui/fonttypedialog \
+	starmath/uiconfig/smath/ui/mathwindow \
 	starmath/uiconfig/smath/ui/printeroptions \
 	starmath/uiconfig/smath/ui/savedefaultsdialog \
 	starmath/uiconfig/smath/ui/smathsettings \
diff --git a/starmath/inc/scrwin.hxx b/starmath/inc/scrwin.hxx
deleted file mode 100644
index 348779e312b9..000000000000
--- a/starmath/inc/scrwin.hxx
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include <vcl/window.hxx>
-#include <vcl/vclptr.hxx>
-
-class DataChangedEvent;
-class ScrollBar;
-class ScrollBarBox;
-
-class ScrollableWindow : public vcl::Window
-{
-private:
-    Point           aPixOffset;         // offset to virtual window (pixel)
-    Size            aTotPixSz;          // total size of virtual window (pixel)
-    tools::Long            nLinePixH;          // size of a line/column (pixel)
-    tools::Long            nColumnPixW;
-
-    VclPtr<ScrollBar>    aVScroll;      // the scrollbars
-    VclPtr<ScrollBar>    aHScroll;
-    VclPtr<ScrollBarBox> aCornerWin;    // window in the bottom right corner
-    bool            bScrolling:1;       // user controlled scrolling
-
-    DECL_LINK( ScrollHdl, ScrollBar *, void );
-    DECL_LINK( EndScrollHdl, ScrollBar *, void );
-
-public:
-                    ScrollableWindow( vcl::Window* pParent );
-    virtual         ~ScrollableWindow() override;
-    virtual void    dispose() override;
-
-    virtual void    Resize() override;
-    virtual void    Command( const CommandEvent& rCEvt ) override;
-    virtual void    DataChanged( const DataChangedEvent& rDEvt ) override;
-
-    using OutputDevice::SetMapMode;
-    virtual void    SetMapMode( const MapMode& rNewMapMode ) override;
-    MapMode GetMapMode() const;
-
-    void            SetTotalSize( const Size& rNewSize );
-    Size            GetTotalSize() const { return PixelToLogic( aTotPixSz ); }
-
-    using Window::Scroll;
-    virtual void    Scroll( tools::Long nDeltaX, tools::Long nDeltaY, ScrollFlags nFlags = ScrollFlags::NONE ) override;
-
-private:
-    Size         GetOutputSizePixel() const;
-};
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/starmath/inc/view.hxx b/starmath/inc/view.hxx
index 411904105059..94733e251cf5 100644
--- a/starmath/inc/view.hxx
+++ b/starmath/inc/view.hxx
@@ -30,16 +30,61 @@
 #include <vcl/timer.hxx>
 #include "document.hxx"
 #include "edit.hxx"
-#include "scrwin.hxx"
 
 class SmViewShell;
 class SmPrintUIOptions;
 class SmGraphicAccessible;
+class SmGraphicWidget;
 class SmElementsDockingWindow;
 
 namespace svtools { class ColorConfig; }
 
-class SmGraphicWindow final : public ScrollableWindow
+class SmGraphicWindow final : public InterimItemWindow
+{
+private:
+    Point aPixOffset; // offset to virtual window (pixel)
+    Size aTotPixSz; // total size of virtual window (pixel)
+    tools::Long nLinePixH; // size of a line/column (pixel)
+    tools::Long nColumnPixW;
+    sal_uInt16 nZoom;
+
+    std::unique_ptr<weld::ScrolledWindow> mxScrolledWindow;
+    std::unique_ptr<SmGraphicWidget> mxGraphic;
+    std::unique_ptr<weld::CustomWeld> mxGraphicWin;
+
+    DECL_LINK(ScrollHdl, weld::ScrolledWindow&, void);
+
+    void SetGraphicMapMode(const MapMode& rNewMapMode);
+    MapMode GetGraphicMapMode() const;
+
+public:
+    explicit SmGraphicWindow(SmViewShell& rShell);
+    virtual void dispose() override;
+    virtual ~SmGraphicWindow() override;
+
+    void SetTotalSize(const Size& rNewSize);
+    Size GetTotalSize() const;
+
+    void SetZoom(sal_uInt16 Factor);
+    sal_uInt16 GetZoom() const { return nZoom; }
+
+    void ZoomToFitInWindow();
+
+    virtual void Resize() override;
+    void ShowContextMenu(const CommandEvent& rCEvt);
+
+    SmGraphicWidget& GetGraphicWidget()
+    {
+        return *mxGraphic;
+    }
+
+    const SmGraphicWidget& GetGraphicWidget() const
+    {
+        return *mxGraphic;
+    }
+};
+
+class SmGraphicWidget final : public weld::CustomWidgetController
 {
 public:
     bool IsCursorVisible() const
@@ -54,28 +99,21 @@ public:
     void ShowLine(bool bShow);
     const SmNode * SetCursorPos(sal_uInt16 nRow, sal_uInt16 nCol);
 
-    explicit SmGraphicWindow(SmViewShell* pShell);
-    virtual ~SmGraphicWindow() override;
-    virtual void dispose() override;
+    explicit SmGraphicWidget(SmViewShell& rShell, SmGraphicWindow& rGraphicWindow);
+    virtual ~SmGraphicWidget() override;
 
-    // Window
-    virtual void ApplySettings(vcl::RenderContext&) override;
-    virtual void MouseButtonDown(const MouseEvent &rMEvt) override;
-    virtual void MouseMove(const MouseEvent &rMEvt) override;
+    // CustomWidgetController
+    virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
+    virtual bool MouseButtonDown(const MouseEvent &rMEvt) override;
+    virtual bool MouseMove(const MouseEvent &rMEvt) override;
     virtual void GetFocus() override;
     virtual void LoseFocus() override;
 
-    SmViewShell* GetView()
-    {
-        return pViewShell;
-    }
+    void SetTotalSize();
 
-    using Window::SetZoom;
-    void SetZoom(sal_uInt16 Factor);
-    using Window::GetZoom;
-    sal_uInt16 GetZoom() const
+    SmViewShell& GetView()
     {
-        return nZoom;
+        return mrViewShell;
     }
 
     const Point& GetFormulaDrawPos() const
@@ -83,14 +121,9 @@ public:
         return aFormulaDrawPos;
     }
 
-    void ZoomToFitInWindow();
-    using ScrollableWindow::SetTotalSize;
-    void SetTotalSize();
-
     // for Accessibility
     virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
 
-    using Window::GetAccessible;
     SmGraphicAccessible* GetAccessible_Impl()
     {
         return mxAccessible.get();
@@ -101,15 +134,13 @@ private:
     {
         bIsCursorVisible = bVis;
     }
-    using Window::SetCursor;
     void SetCursor(const SmNode *pNode);
     void SetCursor(const tools::Rectangle &rRect);
     static bool IsInlineEditEnabled();
 
     virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override;
-    virtual void KeyInput(const KeyEvent& rKEvt) override;
-    virtual void Command(const CommandEvent& rCEvt) override;
-    virtual void StateChanged( StateChangedType eChanged ) override;
+    virtual bool KeyInput(const KeyEvent& rKEvt) override;
+    virtual bool Command(const CommandEvent& rCEvt) override;
 
     void RepaintViewShellDoc();
     DECL_LINK(CaretBlinkTimerHdl, Timer *, void);
@@ -117,6 +148,8 @@ private:
     void CaretBlinkStart();
     void CaretBlinkStop();
 
+    SmGraphicWindow& mrGraphicWindow;
+
     Point aFormulaDrawPos;
     // old style editing pieces
     tools::Rectangle aCursorRect;
@@ -124,15 +157,14 @@ private:
     bool bIsLineVisible;
     AutoTimer aCaretBlinkTimer;
     rtl::Reference<SmGraphicAccessible> mxAccessible;
-    SmViewShell* pViewShell;
-    sal_uInt16 nZoom;
+    SmViewShell& mrViewShell;
 };
 
 class SmGraphicController final : public SfxControllerItem
 {
-    SmGraphicWindow &rGraphic;
+    SmGraphicWidget &rGraphic;
 public:
-    SmGraphicController(SmGraphicWindow &, sal_uInt16, SfxBindings & );
+    SmGraphicController(SmGraphicWidget &, sal_uInt16, SfxBindings & );
     virtual void StateChanged(sal_uInt16             nSID,
                               SfxItemState       eState,
                               const SfxPoolItem* pState) override;
@@ -209,7 +241,7 @@ class SmViewShell: public SfxViewShell
 {
     std::unique_ptr<sfx2::DocumentInserter> mpDocInserter;
     std::unique_ptr<SfxRequest> mpRequest;
-    VclPtr<SmGraphicWindow> mpGraphic;
+    VclPtr<SmGraphicWindow> mxGraphicWindow;
     SmGraphicController maGraphicController;
     OUString maStatusText;
     bool mbPasteState;
@@ -266,13 +298,18 @@ public:
 
     SmEditWindow * GetEditWindow();
 
-    SmGraphicWindow& GetGraphicWindow()
+    SmGraphicWidget& GetGraphicWidget()
+    {
+        return mxGraphicWindow->GetGraphicWidget();
+    }
+    const SmGraphicWidget& GetGraphicWidget() const
     {
-        return *mpGraphic;
+        return mxGraphicWindow->GetGraphicWidget();
     }
-    const SmGraphicWindow& GetGraphicWindow() const
+
+    SmGraphicWindow& GetGraphicWindow()
     {
-        return *mpGraphic;
+        return *mxGraphicWindow;
     }
 
     SmElementsDockingWindow* GetDockingWindow();
@@ -299,7 +336,7 @@ public:
 
     /** Set bInsertIntoEditWindow so we know where to insert
      *
-     * This method is called whenever SmGraphicWindow or SmEditWindow gets focus,
+     * This method is called whenever SmGraphicWidget or SmEditWindow gets focus,
      * so that when text is inserted from catalog or elsewhere we know whether to
      * insert for the visual editor, or the text editor.
      */
diff --git a/starmath/source/accessibility.cxx b/starmath/source/accessibility.cxx
index bab8d77e7cfe..0ca086397716 100644
--- a/starmath/source/accessibility.cxx
+++ b/starmath/source/accessibility.cxx
@@ -32,6 +32,7 @@
 #include <cppuhelper/supportsservice.hxx>
 #include <osl/diagnose.h>
 #include <svx/AccessibleTextHelper.hxx>
+#include <tools/diagnose_ex.h>
 #include <vcl/svapp.hxx>
 #include <vcl/window.hxx>
 #include <vcl/unohelp2.hxx>
@@ -59,50 +60,7 @@ using namespace com::sun::star::lang;
 using namespace com::sun::star::uno;
 using namespace com::sun::star::accessibility;
 
-
-static awt::Rectangle lcl_GetBounds( vcl::Window const *pWin )
-{
-    // !! see VCLXAccessibleComponent::implGetBounds()
-
-    //! the coordinates returned are relative to the parent window !
-    //! Thus the top-left point may be different from (0, 0) !
-
-    awt::Rectangle aBounds;
-    if (pWin)
-    {
-        tools::Rectangle aRect = pWin->GetWindowExtentsRelative( nullptr );
-        aBounds.X       = aRect.Left();
-        aBounds.Y       = aRect.Top();
-        aBounds.Width   = aRect.GetWidth();
-        aBounds.Height  = aRect.GetHeight();
-        vcl::Window* pParent = pWin->GetAccessibleParentWindow();
-        if (pParent)
-        {
-            tools::Rectangle aParentRect = pParent->GetWindowExtentsRelative( nullptr );
-            awt::Point aParentScreenLoc( aParentRect.Left(), aParentRect.Top() );
-            aBounds.X -= aParentScreenLoc.X;
-            aBounds.Y -= aParentScreenLoc.Y;
-        }
-    }
-    return aBounds;
-}
-
-static awt::Point lcl_GetLocationOnScreen( vcl::Window const *pWin )
-{
-    // !! see VCLXAccessibleComponent::getLocationOnScreen()
-
-    awt::Point aPos;
-    if (pWin)
-    {
-        tools::Rectangle aRect = pWin->GetWindowExtentsRelative( nullptr );
-        aPos.X = aRect.Left();
-        aPos.Y = aRect.Top();
-    }
-    return aPos;
-}
-
-
-SmGraphicAccessible::SmGraphicAccessible( SmGraphicWindow *pGraphicWin ) :
+SmGraphicAccessible::SmGraphicAccessible(SmGraphicWidget *pGraphicWin) :
     aAccName            (SmResId(RID_DOCUMENTSTR)),
     nClientId           (0),
     pWin                (pGraphicWin)
@@ -114,10 +72,9 @@ SmGraphicAccessible::~SmGraphicAccessible()
 {
 }
 
-
 SmDocShell * SmGraphicAccessible::GetDoc_Impl()
 {
-    SmViewShell *pView = pWin ? pWin->GetView() : nullptr;
+    SmViewShell *pView = pWin ? &pWin->GetView() : nullptr;
     return pView ? pView->GetDoc() : nullptr;
 }
 
@@ -171,7 +128,7 @@ sal_Bool SAL_CALL SmGraphicAccessible::containsPoint( const awt::Point& aPoint )
     if (!pWin)
         throw RuntimeException();
 
-    Size aSz( pWin->GetSizePixel() );
+    Size aSz( pWin->GetOutputSizePixel() );
     return  aPoint.X >= 0  &&  aPoint.Y >= 0  &&
             aPoint.X < aSz.Width()  &&  aPoint.Y < aSz.Height();
 }
@@ -191,9 +148,17 @@ awt::Rectangle SAL_CALL SmGraphicAccessible::getBounds()
     SolarMutexGuard aGuard;
     if (!pWin)
         throw RuntimeException();
-    OSL_ENSURE(pWin->GetParent()->GetAccessible() == getAccessibleParent(),
-            "mismatch of window parent and accessible parent" );
-    return lcl_GetBounds( pWin );
+
+    const Point aOutPos;
+    const Size aOutSize(pWin->GetOutputSizePixel());
+    css::awt::Rectangle aRet;
+
+    aRet.X = aOutPos.X();
+    aRet.Y = aOutPos.Y();
+    aRet.Width = aOutSize.Width();
+    aRet.Height = aOutSize.Height();
+
+    return aRet;
 }
 
 awt::Point SAL_CALL SmGraphicAccessible::getLocation()
@@ -201,10 +166,14 @@ awt::Point SAL_CALL SmGraphicAccessible::getLocation()
     SolarMutexGuard aGuard;
     if (!pWin)
         throw RuntimeException();
-    OSL_ENSURE(pWin->GetParent()->GetAccessible() == getAccessibleParent(),
-            "mismatch of window parent and accessible parent" );
-    awt::Rectangle aRect( lcl_GetBounds( pWin ) );
-    return awt::Point( aRect.X, aRect.Y );
+
+    const css::awt::Rectangle aRect(getBounds());
+    css::awt::Point aRet;
+
+    aRet.X = aRect.X;
+    aRet.Y = aRect.Y;
+
+    return aRet;
 }
 
 awt::Point SAL_CALL SmGraphicAccessible::getLocationOnScreen()
@@ -212,9 +181,28 @@ awt::Point SAL_CALL SmGraphicAccessible::getLocationOnScreen()
     SolarMutexGuard aGuard;
     if (!pWin)
         throw RuntimeException();
-    OSL_ENSURE(pWin->GetParent()->GetAccessible() == getAccessibleParent(),
-            "mismatch of window parent and accessible parent" );
-    return lcl_GetLocationOnScreen( pWin );
+
+    css::awt::Point aScreenLoc(0, 0);
+
+    css::uno::Reference<css::accessibility::XAccessible> xParent(getAccessibleParent());
+    if (xParent)
+    {
+        css::uno::Reference<css::accessibility::XAccessibleContext> xParentContext(
+            xParent->getAccessibleContext());
+        css::uno::Reference<css::accessibility::XAccessibleComponent> xParentComponent(
+            xParentContext, css::uno::UNO_QUERY);
+        OSL_ENSURE(xParentComponent.is(),
+                   "WeldEditAccessible::getLocationOnScreen: no parent component!");
+        if (xParentComponent.is())
+        {
+            css::awt::Point aParentScreenLoc(xParentComponent->getLocationOnScreen());
+            css::awt::Point aOwnRelativeLoc(getLocation());
+            aScreenLoc.X = aParentScreenLoc.X + aOwnRelativeLoc.X;
+            aScreenLoc.Y = aParentScreenLoc.Y + aOwnRelativeLoc.Y;
+        }
+    }
+
+    return aScreenLoc;
 }
 
 awt::Size SAL_CALL SmGraphicAccessible::getSize()
@@ -222,16 +210,8 @@ awt::Size SAL_CALL SmGraphicAccessible::getSize()
     SolarMutexGuard aGuard;
     if (!pWin)
         throw RuntimeException();
-    OSL_ENSURE(pWin->GetParent()->GetAccessible() == getAccessibleParent(),
-            "mismatch of window parent and accessible parent" );
-
-    Size aSz( pWin->GetSizePixel() );
-#if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG
-    awt::Rectangle aRect( lcl_GetBounds( pWin ) );
-    Size aSz2( aRect.Width, aRect.Height );
-    assert(aSz == aSz2 && "mismatch in width" );
-#endif
-    return awt::Size( aSz.Width(), aSz.Height() );
+    Size aSz(pWin->GetOutputSizePixel());
+    return css::awt::Size(aSz.Width(), aSz.Height());
 }
 
 void SAL_CALL SmGraphicAccessible::grabFocus()
@@ -246,22 +226,28 @@ void SAL_CALL SmGraphicAccessible::grabFocus()
 sal_Int32 SAL_CALL SmGraphicAccessible::getForeground()
 {
     SolarMutexGuard aGuard;
-
     if (!pWin)
         throw RuntimeException();
-    return static_cast<sal_Int32>(pWin->GetTextColor());
+
+    weld::DrawingArea* pDrawingArea = pWin->GetDrawingArea();
+    OutputDevice& rDevice = pDrawingArea->get_ref_device();
+
+    return static_cast<sal_Int32>(rDevice.GetTextColor());
 }
 
 sal_Int32 SAL_CALL SmGraphicAccessible::getBackground()
 {
     SolarMutexGuard aGuard;
-
     if (!pWin)
         throw RuntimeException();
-    Wallpaper aWall( pWin->GetDisplayBackground() );
+
+    weld::DrawingArea* pDrawingArea = pWin->GetDrawingArea();
+    OutputDevice& rDevice = pDrawingArea->get_ref_device();
+
+    Wallpaper aWall(rDevice.GetBackground());
     Color nCol;
     if (aWall.IsBitmap() || aWall.IsGradient())
-        nCol = pWin->GetSettings().GetStyleSettings().GetWindowColor();
+        nCol = Application::GetSettings().GetStyleSettings().GetWindowColor();
     else
         nCol = aWall.GetColor();
     return static_cast<sal_Int32>(nCol);
@@ -284,24 +270,44 @@ Reference< XAccessible > SAL_CALL SmGraphicAccessible::getAccessibleParent()
     if (!pWin)
         throw RuntimeException();
 
-    vcl::Window *pAccParent = pWin->GetAccessibleParentWindow();
-    OSL_ENSURE( pAccParent, "accessible parent missing" );
-    return pAccParent ? pAccParent->GetAccessible() : Reference< XAccessible >();
+    return pWin->GetDrawingArea()->get_accessible_parent();
 }
 
 sal_Int32 SAL_CALL SmGraphicAccessible::getAccessibleIndexInParent()
 {
     SolarMutexGuard aGuard;
-    sal_Int32 nIdx = -1;
-    vcl::Window *pAccParent = pWin ? pWin->GetAccessibleParentWindow() : nullptr;
-    if (pAccParent)
+
+    // -1 for child not found/no parent (according to specification)
+    sal_Int32 nRet = -1;
+
+    css::uno::Reference<css::accessibility::XAccessible> xParent(getAccessibleParent());
+    if (!xParent)
+        return nRet;
+
+    try
     {
-        sal_uInt16 nCnt = pAccParent->GetAccessibleChildWindowCount();
-        for (sal_uInt16 i = 0;  i < nCnt  &&  nIdx == -1;  ++i)
-            if (pAccParent->GetAccessibleChildWindow( i ) == pWin)
-                nIdx = i;
+        css::uno::Reference<css::accessibility::XAccessibleContext> xParentContext(
+            xParent->getAccessibleContext());
+
+        //  iterate over parent's children and search for this object
+        if (xParentContext.is())
+        {
+            sal_Int32 nChildCount = xParentContext->getAccessibleChildCount();
+            for (sal_Int32 nChild = 0; (nChild < nChildCount) && (-1 == nRet); ++nChild)
+            {
+                css::uno::Reference<css::accessibility::XAccessible> xChild(
+                    xParentContext->getAccessibleChild(nChild));
+                if (xChild.get() == this)
+                    nRet = nChild;
+            }
+        }
+    }
+    catch (const css::uno::Exception&)
+    {
+        TOOLS_WARN_EXCEPTION("svx", "WeldEditAccessible::getAccessibleIndexInParent");
     }
-    return nIdx;
+
+    return nRet;
 }
 
 sal_Int16 SAL_CALL SmGraphicAccessible::getAccessibleRole()
@@ -349,7 +355,9 @@ Reference< XAccessibleStateSet > SAL_CALL SmGraphicAccessible::getAccessibleStat
             pStateSet->AddState( AccessibleStateType::SHOWING );
         if (pWin->IsReallyVisible())
             pStateSet->AddState( AccessibleStateType::VISIBLE );
-        if (COL_TRANSPARENT != pWin->GetBackground().GetColor())
+        weld::DrawingArea* pDrawingArea = pWin->GetDrawingArea();
+        OutputDevice& rDevice = pDrawingArea->get_ref_device();
+        if (COL_TRANSPARENT != rDevice.GetBackground().GetColor())
             pStateSet->AddState( AccessibleStateType::OPAQUE );
     }
 
@@ -443,8 +451,7 @@ awt::Rectangle SAL_CALL SmGraphicAccessible::getCharacterBounds( sal_Int32 nInde
         throw RuntimeException();
 
     // get accessible text
-    SmViewShell *pView = pWin->GetView();
-    SmDocShell  *pDoc  = pView ? pView->GetDoc() : nullptr;
+    SmDocShell* pDoc  = pWin->GetView().GetDoc();
     if (!pDoc)
         throw RuntimeException();
     OUString aTxt( GetAccessibleText_Impl() );
@@ -477,15 +484,18 @@ awt::Rectangle SAL_CALL SmGraphicAccessible::getCharacterBounds( sal_Int32 nInde
             Point aTLPos (pWin->GetFormulaDrawPos() + aOffset);
             Size  aSize (pNode->GetSize());
 
+            weld::DrawingArea* pDrawingArea = pWin->GetDrawingArea();
+            OutputDevice& rDevice = pDrawingArea->get_ref_device();
+
             std::unique_ptr<tools::Long[]> pXAry(new tools::Long[ aNodeText.getLength() ]);
-            pWin->SetFont( pNode->GetFont() );
-            pWin->GetTextArray( aNodeText, pXAry.get(), 0, aNodeText.getLength() );
+            rDevice.SetFont( pNode->GetFont() );
+            rDevice.GetTextArray( aNodeText, pXAry.get(), 0, aNodeText.getLength() );
             aTLPos.AdjustX(nNodeIndex > 0 ? pXAry[nNodeIndex - 1] : 0 );
             aSize.setWidth( nNodeIndex > 0 ? pXAry[nNodeIndex] - pXAry[nNodeIndex - 1] : pXAry[nNodeIndex] );
             pXAry.reset();
 
-            aTLPos = pWin->LogicToPixel( aTLPos );
-            aSize  = pWin->LogicToPixel( aSize );
+            aTLPos = rDevice.LogicToPixel( aTLPos );
+            aSize  = rDevice.LogicToPixel( aSize );
             aRes.X = aTLPos.X();
             aRes.Y = aTLPos.Y();
             aRes.Width  = aSize.Width();
@@ -513,15 +523,18 @@ sal_Int32 SAL_CALL SmGraphicAccessible::getIndexAtPoint( const awt::Point& aPoin
     sal_Int32 nRes = -1;
     if (pWin)
     {
-        const SmNode *pTree = pWin->GetView()->GetDoc()->GetFormulaTree();
+        const SmNode *pTree = pWin->GetView().GetDoc()->GetFormulaTree();
         // can be NULL! e.g. if one clicks within the window already during loading of the
         // document (before the parser even started)
         if (!pTree)
             return nRes;
 
+        weld::DrawingArea* pDrawingArea = pWin->GetDrawingArea();
+        OutputDevice& rDevice = pDrawingArea->get_ref_device();
+
         // get position relative to formula draw position
         Point  aPos( aPoint.X, aPoint.Y );
-        aPos = pWin->PixelToLogic( aPos );
+        aPos = rDevice.PixelToLogic( aPos );
         aPos -= pWin->GetFormulaDrawPos();
 
         // if it was inside the formula then get the appropriate node
@@ -548,8 +561,8 @@ sal_Int32 SAL_CALL SmGraphicAccessible::getIndexAtPoint( const awt::Point& aPoin
                 tools::Long nNodeX = pNode->GetLeft();
 
                 std::unique_ptr<tools::Long[]> pXAry(new tools::Long[ aTxt.getLength() ]);
-                pWin->SetFont( pNode->GetFont() );
-                pWin->GetTextArray( aTxt, pXAry.get(), 0, aTxt.getLength() );
+                rDevice.SetFont( pNode->GetFont() );
+                rDevice.GetTextArray( aTxt, pXAry.get(), 0, aTxt.getLength() );
                 for (sal_Int32 i = 0;  i < aTxt.getLength()  &&  nRes == -1;  ++i)
                 {
                     if (pXAry[i] + nNodeX > aPos.X())
@@ -691,7 +704,7 @@ sal_Bool SAL_CALL SmGraphicAccessible::copyText(
     if (!pWin)
         throw RuntimeException();
 
-    Reference< datatransfer::clipboard::XClipboard > xClipboard = pWin->GetClipboard();
+    Reference< datatransfer::clipboard::XClipboard > xClipboard = GetSystemClipboard();
     if ( xClipboard.is() )
     {
         OUString sText( getTextRange(nStartIndex, nEndIndex) );
diff --git a/starmath/source/accessibility.hxx b/starmath/source/accessibility.hxx
index 817c4ca11e74..5431b9f85b37 100644
--- a/starmath/source/accessibility.hxx
+++ b/starmath/source/accessibility.hxx
@@ -61,7 +61,7 @@ class SmGraphicAccessible final :
     /// client id in the AccessibleEventNotifier queue
     sal_uInt32                          nClientId;
 
-    VclPtr<SmGraphicWindow>             pWin;
+    SmGraphicWidget*                    pWin;
 
     SmGraphicAccessible( const SmGraphicAccessible & ) = delete;
     SmGraphicAccessible & operator = ( const SmGraphicAccessible & ) = delete;
@@ -70,7 +70,7 @@ class SmGraphicAccessible final :
     OUString        GetAccessibleText_Impl();
 
 public:
-    explicit SmGraphicAccessible( SmGraphicWindow *pGraphicWin );
+    explicit SmGraphicAccessible( SmGraphicWidget *pGraphicWin );
     virtual ~SmGraphicAccessible() override;
 
     void                ClearWin();     // to be called when view is destroyed
diff --git a/starmath/source/cursor.cxx b/starmath/source/cursor.cxx
index a839b0eb0a02..e2dbdc44bfe8 100644
--- a/starmath/source/cursor.cxx
+++ b/starmath/source/cursor.cxx
@@ -1320,7 +1320,7 @@ void SmCursor::RequestRepaint(){
         if ( SfxObjectCreateMode::EMBEDDED == mpDocShell->GetCreateMode() )
             mpDocShell->Repaint();
         else
-            pViewSh->GetGraphicWindow().Invalidate();
+            pViewSh->GetGraphicWidget().Invalidate();
     }
 }
 
diff --git a/starmath/source/document.cxx b/starmath/source/document.cxx
index c3faff24b8d1..10fee0c6f39c 100644
--- a/starmath/source/document.cxx
+++ b/starmath/source/document.cxx
@@ -174,7 +174,7 @@ void SmDocShell::SetText(const OUString& rBuffer)
             Repaint();
         }
         else
-            pViewSh->GetGraphicWindow().Invalidate();
+            pViewSh->GetGraphicWidget().Invalidate();
     }
 
     if ( bIsEnabled )
@@ -182,7 +182,7 @@ void SmDocShell::SetText(const OUString& rBuffer)
     SetModified();
 
     // launch accessible event if necessary
-    SmGraphicAccessible *pAcc = pViewSh ? pViewSh->GetGraphicWindow().GetAccessible_Impl() : nullptr;
+    SmGraphicAccessible *pAcc = pViewSh ? pViewSh->GetGraphicWidget().GetAccessible_Impl() : nullptr;
     if (pAcc)
     {
         Any aOldValue, aNewValue;
@@ -260,7 +260,7 @@ void SmDocShell::ArrangeFormula()
     {
         SmViewShell *pView = SmGetActiveView();
         if (pView)
-            pOutDev = &pView->GetGraphicWindow();
+            pOutDev = &pView->GetGraphicWidget().GetDrawingArea()->get_ref_device();
         else
         {
             pOutDev = &SM_MOD()->GetDefaultVirtualDev();
@@ -622,7 +622,7 @@ void SmDocShell::Repaint()
     SetVisAreaSize(aVisSize);
     SmViewShell* pViewSh = SmGetActiveView();
     if (pViewSh)
-        pViewSh->GetGraphicWindow().Invalidate();
+        pViewSh->GetGraphicWidget().Invalidate();
 
     if (bIsEnabled)
         EnableSetModified(bIsEnabled);
@@ -1145,7 +1145,7 @@ void SmDocShell::GetState(SfxItemSet &rSet)
             break;
 
         case SID_GRAPHIC_SM:
-            //! very old (pre UNO) and ugly hack to invalidate the SmGraphicWindow.
+            //! very old (pre UNO) and ugly hack to invalidate the SmGraphicWidget.
             //! If mnModifyCount gets changed then the call below will implicitly notify
             //! SmGraphicController::StateChanged and there the window gets invalidated.
             //! Thus all the 'mnModifyCount++' before invalidating this slot.
diff --git a/starmath/source/edit.cxx b/starmath/source/edit.cxx
index 4c3549ec8d62..2aa3c31d5d7b 100644
--- a/starmath/source/edit.cxx
+++ b/starmath/source/edit.cxx
@@ -265,7 +265,7 @@ IMPL_LINK_NOARG(SmEditTextWindow, CursorMoveTimerHdl, Timer *, void)
             sal_Int32  nRow;
             sal_uInt16 nCol;
             SmGetLeftSelectionPart(aNewSelection, nRow, nCol);
-            pViewSh->GetGraphicWindow().SetCursorPos(static_cast<sal_uInt16>(nRow), nCol);
+            pViewSh->GetGraphicWidget().SetCursorPos(static_cast<sal_uInt16>(nRow), nCol);
             aOldSelection = aNewSelection;
         }
     }
@@ -424,7 +424,7 @@ bool SmEditTextWindow::KeyInput(const KeyEvent& rKEvt)
             // SFX has maybe called a slot of the view and thus (because of a hack in SFX)
             // set the focus to the view
             SmViewShell* pVShell = mrEditWindow.GetView();
-            if ( pVShell && pVShell->GetGraphicWindow().HasFocus() )
+            if ( pVShell && pVShell->GetGraphicWidget().HasFocus() )
             {
                 GrabFocus();
             }
diff --git a/starmath/source/scrwin.cxx b/starmath/source/scrwin.cxx
deleted file mode 100644
index 596ed799424e..000000000000
--- a/starmath/source/scrwin.cxx
+++ /dev/null
@@ -1,345 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <vcl/commandevent.hxx>
-#include <vcl/event.hxx>
-#include <vcl/settings.hxx>
-#include <vcl/scrbar.hxx>
-#include <scrwin.hxx>
-
-ScrollableWindow::ScrollableWindow( vcl::Window* pParent ) :
-    Window( pParent, WB_CLIPCHILDREN ),
-    aVScroll( VclPtr<ScrollBar>::Create(this, WinBits(WB_VSCROLL | WB_DRAG)) ),
-    aHScroll( VclPtr<ScrollBar>::Create(this, WinBits(WB_HSCROLL | WB_DRAG)) ),
-    aCornerWin( VclPtr<ScrollBarBox>::Create(this) )
-{
-    bScrolling = false;
-
-    // set the handlers for the scrollbars
-    aVScroll->SetScrollHdl( LINK(this, ScrollableWindow, ScrollHdl) );
-    aHScroll->SetScrollHdl( LINK(this, ScrollableWindow, ScrollHdl) );
-    aVScroll->SetEndScrollHdl( LINK(this, ScrollableWindow, EndScrollHdl) );
-    aHScroll->SetEndScrollHdl( LINK(this, ScrollableWindow, EndScrollHdl) );
-
-    nColumnPixW = nLinePixH = GetSettings().GetStyleSettings().GetScrollBarSize();
-}
-
-
-ScrollableWindow::~ScrollableWindow()
-{
-    disposeOnce();
-}
-
-void ScrollableWindow::dispose()
-{
-    aVScroll.disposeAndClear();
-    aHScroll.disposeAndClear();
-    aCornerWin.disposeAndClear();
-    Window::dispose();
-}
-
-
-void ScrollableWindow::Command( const CommandEvent& rCEvt )
-{
-    if ( (rCEvt.GetCommand() == CommandEventId::Wheel) ||
-         (rCEvt.GetCommand() == CommandEventId::StartAutoScroll) ||
-         (rCEvt.GetCommand() == CommandEventId::AutoScroll) )
-    {
-        ScrollBar* pHScrBar;
-        ScrollBar* pVScrBar;
-        if ( aHScroll->IsVisible() )
-            pHScrBar = aHScroll.get();
-        else
-            pHScrBar = nullptr;
-        if ( aVScroll->IsVisible() )
-            pVScrBar = aVScroll.get();
-        else
-            pVScrBar = nullptr;
-        if ( HandleScrollCommand( rCEvt, pHScrBar, pVScrBar ) )
-            return;
-    }
-
-    Window::Command( rCEvt );
-}
-
-
-void ScrollableWindow::DataChanged( const DataChangedEvent& rDCEvt )
-{
-    if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
-         (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
-    {
-        Resize();
-        Invalidate();
-    }
-
-    Window::DataChanged( rDCEvt );
-}
-
-
-Size ScrollableWindow::GetOutputSizePixel() const
-{
-    Size aSz( Window::GetOutputSizePixel() );
-
-    tools::Long nTmp = GetSettings().GetStyleSettings().GetScrollBarSize();
-    if ( aHScroll->IsVisible() )
-        aSz.AdjustHeight( -nTmp );
-    if ( aVScroll->IsVisible() )
-        aSz.AdjustWidth( -nTmp );
-    return aSz;
-}
-
-
-IMPL_LINK( ScrollableWindow, EndScrollHdl, ScrollBar *, /*pScroll*/, void )
-{
-    // notify the end of scrolling
-    bScrolling = false;
-}
-
-
-IMPL_LINK( ScrollableWindow, ScrollHdl, ScrollBar *, pScroll, void )
-{
-    // notify the start of scrolling, if not already scrolling
-    if ( !bScrolling )
-        bScrolling = true;
-
-    // get the delta in logic coordinates
-    Size aDelta( PixelToLogic(
-        Size( aHScroll->GetDelta(), aVScroll->GetDelta() ) ) );
-    if ( pScroll == aHScroll.get() )
-        Scroll( aDelta.Width(), 0 );
-    else
-        Scroll( 0, aDelta.Height() );
-}
-
-
-void ScrollableWindow::Resize()
-{
-    // get the new output-size in pixel
-    Size aOutPixSz = Window::GetOutputSizePixel();
-
-    // determine the size of the output-area and if we need scrollbars
-    const tools::Long nScrSize = GetSettings().GetStyleSettings().GetScrollBarSize();
-    bool bVVisible = false; // by default no vertical-ScrollBar
-    bool bHVisible = false; // by default no horizontal-ScrollBar
-    bool bChanged;          // determines if a visiblility was changed
-    do
-    {
-        bChanged = false;
-
-        // does we need a vertical ScrollBar
-        if ( aOutPixSz.Width() < aTotPixSz.Width() && !bHVisible )
-        {
-            bHVisible = true;
-            aOutPixSz.AdjustHeight( -nScrSize );
-            bChanged = true;
-        }
-
-        // does we need a horizontal ScrollBar
-        if ( aOutPixSz.Height() < aTotPixSz.Height() && !bVVisible )
-        {
-            bVVisible = true;
-            aOutPixSz.AdjustWidth( -nScrSize );
-            bChanged = true;
-        }
-
-    }
-    while ( bChanged );   // until no visibility has changed
-
-    // store the old offset and map-mode
-    MapMode aMap( GetMapMode() );
-    Point aOldPixOffset( aPixOffset );
-
-    // justify (right/bottom borders should never exceed the virtual window)
-    Size aPixDelta;
-    if ( aPixOffset.X() < 0 &&
-         aPixOffset.X() + aTotPixSz.Width() < aOutPixSz.Width() )
-        aPixDelta.setWidth(
-            aOutPixSz.Width() - ( aPixOffset.X() + aTotPixSz.Width() ) );
-    if ( aPixOffset.Y() < 0 &&
-         aPixOffset.Y() + aTotPixSz.Height() < aOutPixSz.Height() )
-        aPixDelta.setHeight(
-            aOutPixSz.Height() - ( aPixOffset.Y() + aTotPixSz.Height() ) );
-    if ( aPixDelta.Width() || aPixDelta.Height() )
-    {
-        aPixOffset.AdjustX(aPixDelta.Width() );
-        aPixOffset.AdjustY(aPixDelta.Height() );
-    }
-
-    // for axis without scrollbar restore the origin
-    if ( !bVVisible || !bHVisible )
-    {
-        aPixOffset = Point(
-                     bHVisible
-                     ? aPixOffset.X()
-                     : (aOutPixSz.Width()-aTotPixSz.Width()) / 2,
-                     bVVisible
-                     ? aPixOffset.Y()
-                     : (aOutPixSz.Height()-aTotPixSz.Height()) / 2 );
-    }
-    if ( bHVisible && !aHScroll->IsVisible() )
-        aPixOffset.setX( 0 );
-    if ( bVVisible && !aVScroll->IsVisible() )
-        aPixOffset.setY( 0 );
-
-    // select the shifted map-mode
-    if ( aPixOffset != aOldPixOffset )
-    {
-        Window::SetMapMode( MapMode( MapUnit::MapPixel ) );
-        Window::Scroll(
-            aPixOffset.X() - aOldPixOffset.X(),
-            aPixOffset.Y() - aOldPixOffset.Y() );
-        SetMapMode( aMap );
-    }
-
-    // show or hide scrollbars
-    aVScroll->Show( bVVisible );
-    aHScroll->Show( bHVisible );
-
-    // disable painting in the corner between the scrollbars
-    if ( bVVisible && bHVisible )
-    {
-        aCornerWin->SetPosSizePixel(Point(aOutPixSz.Width(), aOutPixSz.Height()),
-            Size(nScrSize, nScrSize) );
-        aCornerWin->Show();
-    }
-    else
-        aCornerWin->Hide();
-
-    // resize scrollbars and set their ranges
-    if ( bHVisible )
-    {
-        aHScroll->SetPosSizePixel(
-            Point( 0, aOutPixSz.Height() ),
-            Size( aOutPixSz.Width(), nScrSize ) );
-        aHScroll->SetRange( Range( 0, aTotPixSz.Width() ) );
-        aHScroll->SetPageSize( aOutPixSz.Width() );
-        aHScroll->SetVisibleSize( aOutPixSz.Width() );
-        aHScroll->SetLineSize( nColumnPixW );
-        aHScroll->SetThumbPos( -aPixOffset.X() );
-    }
-    if ( bVVisible )
-    {
-        aVScroll->SetPosSizePixel(
-            Point( aOutPixSz.Width(), 0 ),
-            Size( nScrSize,aOutPixSz.Height() ) );
-        aVScroll->SetRange( Range( 0, aTotPixSz.Height() ) );
-        aVScroll->SetPageSize( aOutPixSz.Height() );
-        aVScroll->SetVisibleSize( aOutPixSz.Height() );
-        aVScroll->SetLineSize( nLinePixH );
-        aVScroll->SetThumbPos( -aPixOffset.Y() );
-    }
-}
-
-
-void ScrollableWindow::SetMapMode( const MapMode& rNewMapMode )
-{
-    MapMode aMap( rNewMapMode );
-    aMap.SetOrigin( aMap.GetOrigin() + PixelToLogic( aPixOffset, aMap ) );
-    Window::SetMapMode( aMap );
-}
-
-
-MapMode ScrollableWindow::GetMapMode() const
-{
-    MapMode aMap( Window::GetMapMode() );
-    aMap.SetOrigin( aMap.GetOrigin() - PixelToLogic( aPixOffset ) );
-    return aMap;
-}
-
-
-void ScrollableWindow::SetTotalSize( const Size& rNewSize )
-{
-    aTotPixSz = LogicToPixel( rNewSize );
-    ScrollableWindow::Resize();
-}
-
-
-void ScrollableWindow::Scroll( tools::Long nDeltaX, tools::Long nDeltaY, ScrollFlags )
-{
-    // get the delta in pixel
-    Size aDeltaPix( LogicToPixel( Size(nDeltaX, nDeltaY) ) );
-    Size aOutPixSz( GetOutputSizePixel() );
-    MapMode aMap( GetMapMode() );
-    Point aNewPixOffset( aPixOffset );
-
-    // scrolling horizontally?
-    if ( nDeltaX != 0 )
-    {
-        aNewPixOffset.AdjustX( -(aDeltaPix.Width()) );
-        if ( ( aOutPixSz.Width() - aNewPixOffset.X() ) > aTotPixSz.Width() )
-            aNewPixOffset.setX( - ( aTotPixSz.Width() - aOutPixSz.Width() ) );
-        else if ( aNewPixOffset.X() > 0 )
-            aNewPixOffset.setX( 0 );
-    }
-
-    // scrolling vertically?
-    if ( nDeltaY != 0 )
-    {
-        aNewPixOffset.AdjustY( -(aDeltaPix.Height()) );
-        if ( ( aOutPixSz.Height() - aNewPixOffset.Y() ) > aTotPixSz.Height() )
-            aNewPixOffset.setY( - ( aTotPixSz.Height() - aOutPixSz.Height() ) );
-        else if ( aNewPixOffset.Y() > 0 )
-            aNewPixOffset.setY( 0 );
-    }
-
-    // recompute the logical scroll units
-    aDeltaPix.setWidth( aPixOffset.X() - aNewPixOffset.X() );
-    aDeltaPix.setHeight( aPixOffset.Y() - aNewPixOffset.Y() );
-    Size aDelta( PixelToLogic(aDeltaPix) );
-    nDeltaX = aDelta.Width();
-    nDeltaY = aDelta.Height();
-    aPixOffset = aNewPixOffset;
-
-    // scrolling?
-    if ( nDeltaX != 0 || nDeltaY != 0 )
-    {
-        PaintImmediately();
-
-        // does the new area overlap the old one?
-        if ( std::abs( static_cast<int>(aDeltaPix.Height()) ) < aOutPixSz.Height() ||
-             std::abs( static_cast<int>(aDeltaPix.Width()) ) < aOutPixSz.Width() )
-        {
-            // scroll the overlapping area
-            SetMapMode( aMap );
-
-            // never scroll the scrollbars itself!
-            Window::Scroll(-nDeltaX, -nDeltaY,
-                PixelToLogic( tools::Rectangle( Point(0, 0), aOutPixSz ) ) );
-        }
-        else
-        {
-            // repaint all
-            SetMapMode( aMap );
-            Invalidate();
-        }
-
-        PaintImmediately();
-    }
-
-    if ( !bScrolling )
-    {
-        if ( nDeltaX )
-            aHScroll->SetThumbPos( -aPixOffset.X() );
-        if ( nDeltaY )
-            aVScroll->SetThumbPos( -aPixOffset.Y() );
-    }
-}
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx
index 73b52e9c2750..a007d1d4ff0b 100644
--- a/starmath/source/view.cxx
+++ b/starmath/source/view.cxx
@@ -92,18 +92,209 @@ using namespace css;
 using namespace css::accessibility;
 using namespace css::uno;
 
-SmGraphicWindow::SmGraphicWindow(SmViewShell* pShell)
-    : ScrollableWindow(&pShell->GetViewFrame()->GetWindow())
-    , pViewShell(pShell)
+SmGraphicWindow::SmGraphicWindow(SmViewShell& rShell)
+    : InterimItemWindow(&rShell.GetViewFrame()->GetWindow(), "modules/smath/ui/mathwindow.ui", "MathWindow")
     , nZoom(100)
+    // continue to use user-scrolling to make this work equivalent to how it 'always' worked
+    , mxScrolledWindow(m_xBuilder->weld_scrolled_window("scrolledwindow", true))
+    , mxGraphic(new SmGraphicWidget(rShell, *this))
+    , mxGraphicWin(new weld::CustomWeld(*m_xBuilder, "mathview", *mxGraphic))
 {
-    assert(pViewShell);
+    nColumnPixW = nLinePixH = GetSettings().GetStyleSettings().GetScrollBarSize();
+
+    mxScrolledWindow->connect_hadjustment_changed(LINK(this, SmGraphicWindow, ScrollHdl));
+    mxScrolledWindow->connect_vadjustment_changed(LINK(this, SmGraphicWindow, ScrollHdl));
+
     // docking windows are usually hidden (often already done in the
     // resource) and will be shown by the sfx framework.
     Hide();
+}
+
+void SmGraphicWindow::dispose()
+{
+    mxGraphicWin.reset();
+    mxGraphic.reset();
+    mxScrolledWindow.reset();
+    InterimItemWindow::dispose();
+}
+
+SmGraphicWindow::~SmGraphicWindow()
+{
+    disposeOnce();
+}
+
+void SmGraphicWindow::Resize()
+{
+    InterimItemWindow::Resize();
+
+    // get the new output-size in pixel
+    Size aOutPixSz = GetOutputSizePixel();
+
+    // determine the size of the output-area and if we need scrollbars
+    const auto nScrSize = mxScrolledWindow->get_scroll_thickness();
+    bool bVVisible = false; // by default no vertical-ScrollBar
+    bool bHVisible = false; // by default no horizontal-ScrollBar
+    bool bChanged;          // determines if a visiblility was changed
+    do
+    {
+        bChanged = false;
+
+        // does we need a vertical ScrollBar
+        if ( aOutPixSz.Width() < aTotPixSz.Width() && !bHVisible )
+        {
+            bHVisible = true;
+            aOutPixSz.AdjustHeight( -nScrSize );
+            bChanged = true;
+        }
+
+        // does we need a horizontal ScrollBar
+        if ( aOutPixSz.Height() < aTotPixSz.Height() && !bVVisible )
+        {
+            bVVisible = true;
+            aOutPixSz.AdjustWidth( -nScrSize );
+            bChanged = true;
+        }
+
+    }
+    while ( bChanged );   // until no visibility has changed
+
+    // store the old offset and map-mode
+    MapMode aMap(GetGraphicMapMode());
+    Point aOldPixOffset(aPixOffset);
+
+    // justify (right/bottom borders should never exceed the virtual window)
+    Size aPixDelta;
+    if ( aPixOffset.X() < 0 &&
+         aPixOffset.X() + aTotPixSz.Width() < aOutPixSz.Width() )
+        aPixDelta.setWidth(
+            aOutPixSz.Width() - ( aPixOffset.X() + aTotPixSz.Width() ) );
+    if ( aPixOffset.Y() < 0 &&
+         aPixOffset.Y() + aTotPixSz.Height() < aOutPixSz.Height() )
+        aPixDelta.setHeight(
+            aOutPixSz.Height() - ( aPixOffset.Y() + aTotPixSz.Height() ) );
+    if ( aPixDelta.Width() || aPixDelta.Height() )
+    {
+        aPixOffset.AdjustX(aPixDelta.Width() );
+        aPixOffset.AdjustY(aPixDelta.Height() );
+    }
+
+    // for axis without scrollbar restore the origin
+    if ( !bVVisible || !bHVisible )
+    {
+        aPixOffset = Point(
+                     bHVisible
+                     ? aPixOffset.X()
+                     : (aOutPixSz.Width()-aTotPixSz.Width()) / 2,
+                     bVVisible
+                     ? aPixOffset.Y()
+                     : (aOutPixSz.Height()-aTotPixSz.Height()) / 2 );
+    }
+    if (bHVisible && mxScrolledWindow->get_hpolicy() == VclPolicyType::NEVER)
+        aPixOffset.setX( 0 );
+    if (bVVisible && mxScrolledWindow->get_vpolicy() == VclPolicyType::NEVER)
+        aPixOffset.setY( 0 );
+
+    // select the shifted map-mode
+    if (aPixOffset != aOldPixOffset)
+        SetGraphicMapMode(aMap);
+
+    // show or hide scrollbars
+    mxScrolledWindow->set_vpolicy(bVVisible ? VclPolicyType::ALWAYS : VclPolicyType::NEVER);
+    mxScrolledWindow->set_hpolicy(bHVisible ? VclPolicyType::ALWAYS : VclPolicyType::NEVER);
+
+    // resize scrollbars and set their ranges
+    if ( bHVisible )
+    {
+        mxScrolledWindow->hadjustment_configure(-aPixOffset.X(), 0, aTotPixSz.Width(), nColumnPixW,
+                                                aOutPixSz.Width(), aOutPixSz.Width());
+    }
+    if ( bVVisible )
+    {
+        mxScrolledWindow->vadjustment_configure(-aPixOffset.Y(), 0, aTotPixSz.Height(), nLinePixH,
+                                                aOutPixSz.Height(), aOutPixSz.Height());
+    }
+}
+
+IMPL_LINK_NOARG(SmGraphicWindow, ScrollHdl, weld::ScrolledWindow&, void)
+{
+    MapMode aMap(GetGraphicMapMode());
+    Point aNewPixOffset(aPixOffset);
+
+    // scrolling horizontally?
+    if (mxScrolledWindow->get_hpolicy() == VclPolicyType::ALWAYS)
+        aNewPixOffset.setX(-mxScrolledWindow->hadjustment_get_value());
+
+    // scrolling vertically?
+    if (mxScrolledWindow->get_vpolicy() == VclPolicyType::ALWAYS)
+        aNewPixOffset.setY(-mxScrolledWindow->vadjustment_get_value());
+
+    // scrolling?
+    if (aPixOffset == aNewPixOffset)
+        return;
+
+    // recompute the logical scroll units
+    aPixOffset = aNewPixOffset;
+
+    SetGraphicMapMode(aMap);
+}
+
+void SmGraphicWindow::SetGraphicMapMode(const MapMode& rNewMapMode)
+{
+    OutputDevice& rDevice = mxGraphic->GetDrawingArea()->get_ref_device();
+    MapMode aMap( rNewMapMode );
+    aMap.SetOrigin( aMap.GetOrigin() + rDevice.PixelToLogic( aPixOffset, aMap ) );
+    rDevice.SetMapMode( aMap );
+    mxGraphic->Invalidate();
+}
+
+MapMode SmGraphicWindow::GetGraphicMapMode() const
+{
+    OutputDevice& rDevice = mxGraphic->GetDrawingArea()->get_ref_device();
+    MapMode aMap(rDevice.GetMapMode());
+    aMap.SetOrigin( aMap.GetOrigin() - rDevice.PixelToLogic( aPixOffset ) );
+    return aMap;
+}
+
+void SmGraphicWindow::SetTotalSize( const Size& rNewSize )
+{
+    OutputDevice& rDevice = mxGraphic->GetDrawingArea()->get_ref_device();
+    aTotPixSz = rDevice.LogicToPixel(rNewSize);
+    Resize();
+}
+
+Size SmGraphicWindow::GetTotalSize() const
+{
+    OutputDevice& rDevice = mxGraphic->GetDrawingArea()->get_ref_device();
+    return rDevice.PixelToLogic(aTotPixSz);
+}
+
+void SmGraphicWindow::ShowContextMenu(const CommandEvent& rCEvt)
+{
+    GetParent()->ToTop();
+    Point aPos(5, 5);
+    if (rCEvt.IsMouseEvent())
+        aPos = rCEvt.GetMousePosPixel();
+
+    // added for replaceability of context menus
+    SfxDispatcher::ExecutePopup( this, &aPos );
+}
+
+SmGraphicWidget::SmGraphicWidget(SmViewShell& rShell, SmGraphicWindow& rGraphicWindow)
+    : mrGraphicWindow(rGraphicWindow)
+    , mrViewShell(rShell)
+{
+}
+
+void SmGraphicWidget::SetDrawingArea(weld::DrawingArea* pDrawingArea)
+{
+    weld::CustomWidgetController::SetDrawingArea(pDrawingArea);
+
+    OutputDevice& rDevice = pDrawingArea->get_ref_device();
+
+    rDevice.SetBackground(SM_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor);
 
     const Fraction aFraction(1, 1);
-    SetMapMode(MapMode(MapUnit::Map100thMM, Point(), aFraction, aFraction));
+    rDevice.SetMapMode(MapMode(MapUnit::Map100thMM, Point(), aFraction, aFraction));
 
     SetTotalSize();
 
@@ -113,31 +304,16 @@ SmGraphicWindow::SmGraphicWindow(SmViewShell* pShell)
     CaretBlinkInit();
 }
 
-SmGraphicWindow::~SmGraphicWindow()
-{
-    disposeOnce();
-}
-
-void SmGraphicWindow::dispose()
+SmGraphicWidget::~SmGraphicWidget()
 {
     if (mxAccessible.is())
         mxAccessible->ClearWin();    // make Accessible nonfunctional
     mxAccessible.clear();
     CaretBlinkStop();
-    ScrollableWindow::dispose();
 }
 
-void SmGraphicWindow::StateChanged(StateChangedType eType)
+bool SmGraphicWidget::MouseButtonDown(const MouseEvent& rMEvt)
 {
-    if (eType == StateChangedType::InitShow)
-        Show();
-    ScrollableWindow::StateChanged(eType);
-}
-
-void SmGraphicWindow::MouseButtonDown(const MouseEvent& rMEvt)
-{
-    ScrollableWindow::MouseButtonDown(rMEvt);
-
     GrabFocus();
 
     // set formula-cursor and selection of edit window according to the
@@ -145,19 +321,19 @@ void SmGraphicWindow::MouseButtonDown(const MouseEvent& rMEvt)
 
     SAL_WARN_IF( rMEvt.GetClicks() == 0, "starmath", "0 clicks" );
     if ( !rMEvt.IsLeft() )
-        return;
+        return true;
 
+    OutputDevice& rDevice = GetDrawingArea()->get_ref_device();
     // get click position relative to formula
-    Point  aPos (PixelToLogic(rMEvt.GetPosPixel())
-                 - GetFormulaDrawPos());
+    Point aPos(rDevice.PixelToLogic(rMEvt.GetPosPixel()) - GetFormulaDrawPos());
 
-    const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree();
+    const SmNode *pTree = mrViewShell.GetDoc()->GetFormulaTree();
     if (!pTree)
-        return;
+        return true;
 
     if (IsInlineEditEnabled()) {
-        pViewShell->GetDoc()->GetCursor().MoveTo(this, aPos, !rMEvt.IsShift());
-        return;
+        mrViewShell.GetDoc()->GetCursor().MoveTo(&rDevice, aPos, !rMEvt.IsShift());
+        return true;
     }
     const SmNode *pNode = nullptr;
     // if it was clicked inside the formula then get the appropriate node
@@ -165,11 +341,11 @@ void SmGraphicWindow::MouseButtonDown(const MouseEvent& rMEvt)
         pNode = pTree->FindRectClosestTo(aPos);
 
     if (!pNode)
-        return;
+        return true;
 
-    SmEditWindow  *pEdit = pViewShell->GetEditWindow();
+    SmEditWindow* pEdit = mrViewShell.GetEditWindow();
     if (!pEdit)
-        return;
+        return true;
     const SmToken  aToken (pNode->GetToken());
 
     // set selection to the beginning of the token
@@ -179,46 +355,47 @@ void SmGraphicWindow::MouseButtonDown(const MouseEvent& rMEvt)
     // allow for immediate editing and
     //! implicitly synchronize the cursor position mark in this window
     pEdit->GrabFocus();
+
+    return true;
 }
 
-void SmGraphicWindow::MouseMove(const MouseEvent &rMEvt)
+bool SmGraphicWidget::MouseMove(const MouseEvent &rMEvt)
 {
-    ScrollableWindow::MouseMove(rMEvt);
-
     if (rMEvt.IsLeft() && IsInlineEditEnabled())
     {
-        Point aPos(PixelToLogic(rMEvt.GetPosPixel()) - GetFormulaDrawPos());
-        pViewShell->GetDoc()->GetCursor().MoveTo(this, aPos, false);
+        OutputDevice& rDevice = GetDrawingArea()->get_ref_device();
+        Point aPos(rDevice.PixelToLogic(rMEvt.GetPosPixel()) - GetFormulaDrawPos());
+        mrViewShell.GetDoc()->GetCursor().MoveTo(&rDevice, aPos, false);
 
         CaretBlinkStop();
         SetIsCursorVisible(true);
         CaretBlinkStart();
         RepaintViewShellDoc();
     }
+    return true;
 }
 
-bool SmGraphicWindow::IsInlineEditEnabled()
+bool SmGraphicWidget::IsInlineEditEnabled()
 {
     return SmViewShell::IsInlineEditEnabled();
 }
 
-void SmGraphicWindow::GetFocus()
+void SmGraphicWidget::GetFocus()
 {
     if (!IsInlineEditEnabled())
         return;
-    if (pViewShell->GetEditWindow())
-        pViewShell->GetEditWindow()->Flush();
+    if (mrViewShell.GetEditWindow())
+        mrViewShell.GetEditWindow()->Flush();
     //Let view shell know what insertions should be done in visual editor
-    pViewShell->SetInsertIntoEditWindow(false);
+    mrViewShell.SetInsertIntoEditWindow(false);
     SetIsCursorVisible(true);
     ShowLine(true);
     CaretBlinkStart();
     RepaintViewShellDoc();
 }
 
-void SmGraphicWindow::LoseFocus()
+void SmGraphicWidget::LoseFocus()
 {
-    ScrollableWindow::LoseFocus();
     if (mxAccessible.is())
     {
         uno::Any aOldValue, aNewValue;
@@ -235,14 +412,14 @@ void SmGraphicWindow::LoseFocus()
     RepaintViewShellDoc();
 }
 
-void SmGraphicWindow::RepaintViewShellDoc()
+void SmGraphicWidget::RepaintViewShellDoc()
 {
-    SmDocShell* pDoc = pViewShell->GetDoc();
+    SmDocShell* pDoc = mrViewShell.GetDoc();
     if (pDoc)
         pDoc->Repaint();
 }
 
-IMPL_LINK_NOARG(SmGraphicWindow, CaretBlinkTimerHdl, Timer *, void)
+IMPL_LINK_NOARG(SmGraphicWidget, CaretBlinkTimerHdl, Timer *, void)
 {
     if (IsCursorVisible())
         SetIsCursorVisible(false);
@@ -252,13 +429,13 @@ IMPL_LINK_NOARG(SmGraphicWindow, CaretBlinkTimerHdl, Timer *, void)
     RepaintViewShellDoc();
 }
 
-void SmGraphicWindow::CaretBlinkInit()
+void SmGraphicWidget::CaretBlinkInit()
 {
-    aCaretBlinkTimer.SetInvokeHandler(LINK(this, SmGraphicWindow, CaretBlinkTimerHdl));
-    aCaretBlinkTimer.SetTimeout( ScrollableWindow::GetSettings().GetStyleSettings().GetCursorBlinkTime() );
+    aCaretBlinkTimer.SetInvokeHandler(LINK(this, SmGraphicWidget, CaretBlinkTimerHdl));
+    aCaretBlinkTimer.SetTimeout(Application::GetSettings().GetStyleSettings().GetCursorBlinkTime());
 }
 
-void SmGraphicWindow::CaretBlinkStart()
+void SmGraphicWidget::CaretBlinkStart()
 {
     if (!IsInlineEditEnabled())
         return;
@@ -266,28 +443,30 @@ void SmGraphicWindow::CaretBlinkStart()
         aCaretBlinkTimer.Start();
 }
 
-void SmGraphicWindow::CaretBlinkStop()
+void SmGraphicWidget::CaretBlinkStop()
 {
     if (!IsInlineEditEnabled())
         return;
     aCaretBlinkTimer.Stop();
 }
 
-void SmGraphicWindow::ShowCursor(bool bShow)
-    // shows or hides the formula-cursor depending on 'bShow' is true or not
+// shows or hides the formula-cursor depending on 'bShow' is true or not
+void SmGraphicWidget::ShowCursor(bool bShow)
 {
     if (IsInlineEditEnabled())
         return;
 
-    bool  bInvert = bShow != IsCursorVisible();
-
+    bool bInvert = bShow != IsCursorVisible();
     if (bInvert)
-        InvertTracking(aCursorRect, ShowTrackFlags::Small | ShowTrackFlags::TrackWindow);
+    {
+        OutputDevice& rDevice = GetDrawingArea()->get_ref_device();
+        InvertFocusRect(rDevice, aCursorRect);
+    }
 
     SetIsCursorVisible(bShow);
 }
 
-void SmGraphicWindow::ShowLine(bool bShow)
+void SmGraphicWidget::ShowLine(bool bShow)
 {
     if (!IsInlineEditEnabled())
         return;
@@ -295,12 +474,12 @@ void SmGraphicWindow::ShowLine(bool bShow)
     bIsLineVisible = bShow;
 }
 
-void SmGraphicWindow::SetCursor(const SmNode *pNode)
+void SmGraphicWidget::SetCursor(const SmNode *pNode)
 {
     if (IsInlineEditEnabled())
         return;
 
-    const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree();
+    const SmNode *pTree = mrViewShell.GetDoc()->GetFormulaTree();
 
     // get appropriate rectangle
     Point aOffset (pNode->GetTopLeft() - pTree->GetTopLeft()),
@@ -311,7 +490,7 @@ void SmGraphicWindow::SetCursor(const SmNode *pNode)
     SetCursor(tools::Rectangle(aTLPos, aSize));
 }
 
-void SmGraphicWindow::SetCursor(const tools::Rectangle &rRect)
+void SmGraphicWidget::SetCursor(const tools::Rectangle &rRect)
     // sets cursor to new position (rectangle) 'rRect'.
     // The old cursor will be removed, and the new one will be shown if
     // that is activated in the ConfigItem
@@ -328,7 +507,7 @@ void SmGraphicWindow::SetCursor(const tools::Rectangle &rRect)
         ShowCursor(true);       // draw new cursor
 }
 
-const SmNode * SmGraphicWindow::SetCursorPos(sal_uInt16 nRow, sal_uInt16 nCol)
+const SmNode * SmGraphicWidget::SetCursorPos(sal_uInt16 nRow, sal_uInt16 nCol)
     // looks for a VISIBLE node in the formula tree with its token at
     // (or around) the position 'nRow', 'nCol' in the edit window
     // (row and column numbering starts with 1 there!).
@@ -340,7 +519,7 @@ const SmNode * SmGraphicWindow::SetCursorPos(sal_uInt16 nRow, sal_uInt16 nCol)
         return nullptr;
 
     // find visible node with token at nRow, nCol
-    const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree(),
+    const SmNode *pTree = mrViewShell.GetDoc()->GetFormulaTree(),
                  *pNode = nullptr;
     if (pTree)
         pNode = pTree->FindTokenAt(nRow, nCol);
@@ -353,30 +532,25 @@ const SmNode * SmGraphicWindow::SetCursorPos(sal_uInt16 nRow, sal_uInt16 nCol)
     return pNode;
 }
 
-void SmGraphicWindow::ApplySettings(vcl::RenderContext& rRenderContext)
+void SmGraphicWidget::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&)
 {
-    rRenderContext.SetBackground(SM_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor);
-}
-
-void SmGraphicWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&)
-{
-    SmDocShell& rDoc = *pViewShell->GetDoc();
+    SmDocShell& rDoc = *mrViewShell.GetDoc();
     Point aPoint;
 
     rDoc.DrawFormula(rRenderContext, aPoint, true);  //! modifies aPoint to be the topleft
-                                //! corner of the formula
+                                                     //! corner of the formula
     aFormulaDrawPos = aPoint;
     if (IsInlineEditEnabled())
     {
         //Draw cursor if any...
-        if (pViewShell->GetDoc()->HasCursor() && IsLineVisible())
-            pViewShell->GetDoc()->GetCursor().Draw(rRenderContext, aPoint, IsCursorVisible());
+        if (mrViewShell.GetDoc()->HasCursor() && IsLineVisible())
+            mrViewShell.GetDoc()->GetCursor().Draw(rRenderContext, aPoint, IsCursorVisible());
     }
     else
     {
         SetIsCursorVisible(false);  // (old) cursor must be drawn again
 
-        const SmEditWindow* pEdit = pViewShell->GetEditWindow();
+        const SmEditWindow* pEdit = mrViewShell.GetEditWindow();
         if (pEdit)
         {   // get new position for formula-cursor (for possible altered formula)
             sal_Int32  nRow;
@@ -391,24 +565,23 @@ void SmGraphicWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rec
     }
 }
 
-
-void SmGraphicWindow::SetTotalSize ()
+void SmGraphicWidget::SetTotalSize()
 {
-    SmDocShell &rDoc = *pViewShell->GetDoc();
-    const Size aTmp( PixelToLogic( LogicToPixel( rDoc.GetSize() )));
-    if ( aTmp != ScrollableWindow::GetTotalSize() )
-        ScrollableWindow::SetTotalSize( aTmp );
+    SmDocShell &rDoc = *mrViewShell.GetDoc();
+    OutputDevice& rDevice = GetDrawingArea()->get_ref_device();
+    const Size aTmp(rDevice.PixelToLogic(rDevice.LogicToPixel(rDoc.GetSize())));
+    if (aTmp != mrGraphicWindow.GetTotalSize())
+        mrGraphicWindow.SetTotalSize(aTmp);
 }
 
-void SmGraphicWindow::KeyInput(const KeyEvent& rKEvt)
+bool SmGraphicWidget::KeyInput(const KeyEvent& rKEvt)
 {
-    if (!IsInlineEditEnabled()) {
-        if (! (GetView() && GetView()->KeyInput(rKEvt)) )
-            ScrollableWindow::KeyInput(rKEvt);
-        return;
-    }
+    if (!IsInlineEditEnabled())
+        return mrViewShell.KeyInput(rKEvt);
+
+    bool bConsumed = true;
 
-    SmCursor& rCursor = pViewShell->GetDoc()->GetCursor();
+    SmCursor& rCursor = mrViewShell.GetDoc()->GetCursor();
     KeyFuncType eFunc = rKEvt.GetKeyCode().GetFunction();
     if (eFunc == KeyFuncType::COPY)
         rCursor.Copy();
@@ -417,24 +590,25 @@ void SmGraphicWindow::KeyInput(const KeyEvent& rKEvt)
     else if (eFunc == KeyFuncType::PASTE)
         rCursor.Paste();
     else {
+    OutputDevice& rDevice = GetDrawingArea()->get_ref_device();
     sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
     switch(nCode)
     {
         case KEY_LEFT:
         {
-            rCursor.Move(this, MoveLeft, !rKEvt.GetKeyCode().IsShift());
+            rCursor.Move(&rDevice, MoveLeft, !rKEvt.GetKeyCode().IsShift());
         }break;
         case KEY_RIGHT:
         {
-            rCursor.Move(this, MoveRight, !rKEvt.GetKeyCode().IsShift());
+            rCursor.Move(&rDevice, MoveRight, !rKEvt.GetKeyCode().IsShift());
         }break;
         case KEY_UP:
         {
-            rCursor.Move(this, MoveUp, !rKEvt.GetKeyCode().IsShift());
+            rCursor.Move(&rDevice, MoveUp, !rKEvt.GetKeyCode().IsShift());
         }break;
         case KEY_DOWN:
         {
-            rCursor.Move(this, MoveDown, !rKEvt.GetKeyCode().IsShift());
+            rCursor.Move(&rDevice, MoveDown, !rKEvt.GetKeyCode().IsShift());
         }break;
         case KEY_RETURN:
         {
@@ -444,14 +618,14 @@ void SmGraphicWindow::KeyInput(const KeyEvent& rKEvt)
         case KEY_DELETE:
         {
             if(!rCursor.HasSelection()){
-                rCursor.Move(this, MoveRight, false);
+                rCursor.Move(&rDevice, MoveRight, false);
                 if(rCursor.HasComplexSelection()) break;
             }
             rCursor.Delete();
         }break;
         case KEY_BACKSPACE:
         {
-            rCursor.DeletePrev(this);
+            rCursor.DeletePrev(&rDevice);
         }break;
         case KEY_ADD:
             rCursor.InsertElement(PlusElement);
@@ -500,13 +674,13 @@ void SmGraphicWindow::KeyInput(const KeyEvent& rKEvt)
                      || (code == ']' && rCursor.IsAtTailOfBracket(SmBracketType::Square))
                      || (code == '}' && rCursor.IsAtTailOfBracket(SmBracketType::Curly)))
             {
-                rCursor.Move(this, MoveRight);
+                rCursor.Move(&rDevice, MoveRight);
             }
             else{
                 if(code != 0){
                     rCursor.InsertText(OUString(code));
-                }else if (! (GetView() && GetView()->KeyInput(rKEvt)) )
-                    ScrollableWindow::KeyInput(rKEvt);
+                }else if (!mrViewShell.KeyInput(rKEvt))
+                    bConsumed = false;
             }
         }
     }
@@ -515,28 +689,22 @@ void SmGraphicWindow::KeyInput(const KeyEvent& rKEvt)
     CaretBlinkStart();
     SetIsCursorVisible(true);
     RepaintViewShellDoc();
-}
 
+    return bConsumed;
+}
 
-void SmGraphicWindow::Command(const CommandEvent& rCEvt)
+bool SmGraphicWidget::Command(const CommandEvent& rCEvt)
 {
     bool bCallBase = true;
-    if ( !pViewShell->GetViewFrame()->GetFrame().IsInPlace() )
+    if (!mrViewShell.GetViewFrame()->GetFrame().IsInPlace())
     {
         switch ( rCEvt.GetCommand() )
         {
             case CommandEventId::ContextMenu:
-            {
-                GetParent()->ToTop();
-                Point aPos(5, 5);
-                if (rCEvt.IsMouseEvent())
-                    aPos = rCEvt.GetMousePosPixel();
-
-                // added for replaceability of context menus
-                SfxDispatcher::ExecutePopup( this, &aPos );
-
+                // purely for "ExecutePopup" taking a vcl::Window and
+                // we assume SmGraphicWindow 0,0 is at SmEditWindow 0,0
+                mrGraphicWindow.ShowContextMenu(rCEvt);
                 bCallBase = false;
-            }
             break;
 
             case CommandEventId::Wheel:
@@ -544,12 +712,12 @@ void SmGraphicWindow::Command(const CommandEvent& rCEvt)
                 const CommandWheelData* pWData = rCEvt.GetWheelData();
                 if  ( pWData && CommandWheelMode::ZOOM == pWData->GetMode() )
                 {
-                    sal_uInt16 nTmpZoom = GetZoom();
+                    sal_uInt16 nTmpZoom = mrGraphicWindow.GetZoom();
                     if( 0 > pWData->GetDelta() )
                         nTmpZoom -= 10;
                     else
                         nTmpZoom += 10;
-                    SetZoom( nTmpZoom );
+                    mrGraphicWindow.SetZoom(nTmpZoom);
                     bCallBase = false;
                 }
             }
@@ -558,36 +726,31 @@ void SmGraphicWindow::Command(const CommandEvent& rCEvt)
             default: break;
         }
     }
-    if ( bCallBase )
-        ScrollableWindow::Command (rCEvt);
+    return !bCallBase;
 }
 
-
 void SmGraphicWindow::SetZoom(sal_uInt16 Factor)
 {
     nZoom = std::clamp(Factor, MINZOOM, MAXZOOM);
-    Fraction   aFraction (nZoom, 100);
-    SetMapMode( MapMode(MapUnit::Map100thMM, Point(), aFraction, aFraction) );
-    SetTotalSize();
-    SmViewShell *pViewSh = GetView();
-    if (pViewSh)
-    {
-        pViewSh->GetViewFrame()->GetBindings().Invalidate(SID_ATTR_ZOOM);
-        pViewSh->GetViewFrame()->GetBindings().Invalidate(SID_ATTR_ZOOMSLIDER);
-    }
-    Invalidate();
+    Fraction aFraction(nZoom, 100);
+    SetGraphicMapMode(MapMode(MapUnit::Map100thMM, Point(), aFraction, aFraction));
+    mxGraphic->SetTotalSize();
+    SmViewShell& rViewSh = mxGraphic->GetView();
+    rViewSh.GetViewFrame()->GetBindings().Invalidate(SID_ATTR_ZOOM);
+    rViewSh.GetViewFrame()->GetBindings().Invalidate(SID_ATTR_ZOOMSLIDER);
 }
 
-
 void SmGraphicWindow::ZoomToFitInWindow()
 {
-    SmDocShell &rDoc = *pViewShell->GetDoc();
+    SmViewShell& rViewSh = mxGraphic->GetView();
+    SmDocShell& rDoc = *rViewSh.GetDoc();
 
     // set defined mapmode before calling 'LogicToPixel' below
-    SetMapMode(MapMode(MapUnit::Map100thMM));
+    SetGraphicMapMode(MapMode(MapUnit::Map100thMM));
 
-    Size       aSize (LogicToPixel(rDoc.GetSize()));
-    Size       aWindowSize (GetSizePixel());
+    OutputDevice& rDevice = mxGraphic->GetDrawingArea()->get_ref_device();
+    Size aSize(rDevice.LogicToPixel(rDoc.GetSize()));
+    Size aWindowSize(GetSizePixel());
 
     if (!aSize.IsEmpty())
     {
@@ -597,7 +760,7 @@ void SmGraphicWindow::ZoomToFitInWindow()
     }
 }
 
-uno::Reference< XAccessible > SmGraphicWindow::CreateAccessible()
+uno::Reference< XAccessible > SmGraphicWidget::CreateAccessible()
 {
     if (!mxAccessible.is())
     {
@@ -607,9 +770,7 @@ uno::Reference< XAccessible > SmGraphicWindow::CreateAccessible()
 }
 
 /**************************************************************************/
-
-
-SmGraphicController::SmGraphicController(SmGraphicWindow &rSmGraphic,
+SmGraphicController::SmGraphicController(SmGraphicWidget &rSmGraphic,
                         sal_uInt16          nId_,
                         SfxBindings     &rBindings) :
     SfxControllerItem(nId_, rBindings),
@@ -617,7 +778,6 @@ SmGraphicController::SmGraphicController(SmGraphicWindow &rSmGraphic,
 {
 }
 
-
 void SmGraphicController::StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState)
 {
     rGraphic.SetTotalSize();
@@ -625,10 +785,7 @@ void SmGraphicController::StateChanged(sal_uInt16 nSID, SfxItemState eState, con
     SfxControllerItem::StateChanged (nSID, eState, pState);
 }
 
-
 /**************************************************************************/
-
-
 SmEditController::SmEditController(SmEditWindow &rSmEdit,
                      sal_uInt16       nId_,
                      SfxBindings  &rBindings) :
@@ -637,8 +794,6 @@ SmEditController::SmEditController(SmEditWindow &rSmEdit,
 {
 }
 
-
-
 void SmEditController::StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState)
 {
     const SfxStringItem *pItem =  dynamic_cast<const SfxStringItem*>( pState);
@@ -875,28 +1030,26 @@ void SmViewShell::InnerResizePixel(const Point &rOfs, const Size &rSize, bool)
     }
 
     SetBorderPixel( SvBorder() );
-    GetGraphicWindow().SetPosSizePixel(rOfs, rSize);
-    GetGraphicWindow().SetTotalSize();
+    mxGraphicWindow->SetPosSizePixel(rOfs, rSize);
+    GetGraphicWidget().SetTotalSize();
 }
 
 void SmViewShell::OuterResizePixel(const Point &rOfs, const Size &rSize)
 {
-    SmGraphicWindow &rWin = GetGraphicWindow();
-    rWin.SetPosSizePixel(rOfs, rSize);
+    mxGraphicWindow->SetPosSizePixel(rOfs, rSize);
     if (GetDoc()->IsPreview())
-        rWin.ZoomToFitInWindow();
-    rWin.PaintImmediately();
+        mxGraphicWindow->ZoomToFitInWindow();
 }
 
 void SmViewShell::QueryObjAreaPixel( tools::Rectangle& rRect ) const
 {
-    rRect.SetSize( GetGraphicWindow().GetSizePixel() );
+    rRect.SetSize(mxGraphicWindow->GetSizePixel());
 }
 
 void SmViewShell::SetZoomFactor( const Fraction &rX, const Fraction &rY )
 {
     const Fraction &rFrac = std::min(rX, rY);
-    GetGraphicWindow().SetZoom(sal::static_int_cast<sal_uInt16>(tools::Long(rFrac * Fraction( 100, 1 ))));
+    mxGraphicWindow->SetZoom(sal::static_int_cast<sal_uInt16>(tools::Long(rFrac * Fraction( 100, 1 ))));
 
     //To avoid rounding errors base class regulates crooked values too
     //if necessary
@@ -1008,7 +1161,6 @@ void SmViewShell::DrawTextLine(OutputDevice& rDevice, const Point& rPosition, co
         rDevice.DrawText(aPoint, rLine);
 }
 
-
 void SmViewShell::DrawText(OutputDevice& rDevice, const Point& rPosition, const OUString& rText, sal_uInt16 MaxWidth)
 {
     if (rText.isEmpty())
@@ -1407,7 +1559,7 @@ void SmViewShell::Execute(SfxRequest& rReq)
 
             pp->GetConfig()->SetShowFormulaCursor(bVal);
             if (!IsInlineEditEnabled())
-                GetGraphicWindow().ShowCursor(bVal);
+                GetGraphicWidget().ShowCursor(bVal);
             break;
         }
         case SID_DRAW:
@@ -1421,16 +1573,16 @@ void SmViewShell::Execute(SfxRequest& rReq)
             break;
 
         case SID_ZOOM_OPTIMAL:
-            mpGraphic->ZoomToFitInWindow();
+            mxGraphicWindow->ZoomToFitInWindow();
             break;
 
         case SID_ZOOMIN:
-            mpGraphic->SetZoom(mpGraphic->GetZoom() + 25);
+            mxGraphicWindow->SetZoom(mxGraphicWindow->GetZoom() + 25);
             break;
 
         case SID_ZOOMOUT:
-            SAL_WARN_IF( mpGraphic->GetZoom() < 25, "starmath", "incorrect sal_uInt16 argument" );
-            mpGraphic->SetZoom(mpGraphic->GetZoom() - 25);
+            SAL_WARN_IF( mxGraphicWindow->GetZoom() < 25, "starmath", "incorrect sal_uInt16 argument" );
+            mxGraphicWindow->SetZoom(mxGraphicWindow->GetZoom() - 25);
             break;
 
         case SID_COPYOBJECT:
@@ -1540,7 +1692,7 @@ void SmViewShell::Execute(SfxRequest& rReq)
             if (IsInlineEditEnabled() && (GetDoc() && !mbInsertIntoEditWindow))
             {
                 GetDoc()->GetCursor().InsertCommandText(rItem.GetValue());
-                GetGraphicWindow().GrabFocus();
+                GetGraphicWidget().GrabFocus();
             }
             break;
 
@@ -1701,7 +1853,7 @@ void SmViewShell::Execute(SfxRequest& rReq)
                 else
                 {
                     SfxItemSet aSet( SmDocShell::GetPool(), svl::Items<SID_ATTR_ZOOM, SID_ATTR_ZOOM>{});
-                    aSet.Put( SvxZoomItem( SvxZoomType::PERCENT, mpGraphic->GetZoom()));
+                    aSet.Put( SvxZoomItem( SvxZoomType::PERCENT, mxGraphicWindow->GetZoom()));
                     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
                     ScopedVclPtr<AbstractSvxZoomDialog> xDlg(pFact->CreateSvxZoomDialog(GetViewFrame()->GetWindow().GetFrameWeld(), aSet));
                     xDlg->SetLimits( MINZOOM, MAXZOOM );
@@ -1720,7 +1872,7 @@ void SmViewShell::Execute(SfxRequest& rReq)
             if ( pArgs && SfxItemState::SET == pArgs->GetItemState(SID_ATTR_ZOOMSLIDER, true, &pItem ) )
             {
                 const sal_uInt16 nCurrentZoom = static_cast<const SvxZoomSliderItem *>(pItem)->GetValue();
-                mpGraphic->SetZoom( nCurrentZoom );
+                mxGraphicWindow->SetZoom(nCurrentZoom);
             }
         }
         break;
@@ -1833,7 +1985,7 @@ void SmViewShell::GetState(SfxItemSet &rSet)
             break;
 
         case SID_ATTR_ZOOM:
-            rSet.Put(SvxZoomItem( SvxZoomType::PERCENT, mpGraphic->GetZoom()));
+            rSet.Put(SvxZoomItem( SvxZoomType::PERCENT, mxGraphicWindow->GetZoom()));
             [[fallthrough]];
         case SID_ZOOMIN:
         case SID_ZOOMOUT:
@@ -1844,7 +1996,7 @@ void SmViewShell::GetState(SfxItemSet &rSet)
 
         case SID_ATTR_ZOOMSLIDER :
             {
-                const sal_uInt16 nCurrentZoom = mpGraphic->GetZoom();
+                const sal_uInt16 nCurrentZoom = mxGraphicWindow->GetZoom();
                 SvxZoomSliderItem aZoomSliderItem( nCurrentZoom, MINZOOM, MAXZOOM );
                 aZoomSliderItem.AddSnappingPoint( 100 );
                 rSet.Put( aZoomSliderItem );
@@ -1889,18 +2041,17 @@ void SmViewShell::GetState(SfxItemSet &rSet)
 
 SmViewShell::SmViewShell(SfxViewFrame *pFrame_, SfxViewShell *)
     : SfxViewShell(pFrame_, SfxViewShellFlags::HAS_PRINTOPTIONS)
-    , mpGraphic(VclPtr<SmGraphicWindow>::Create(this))
-    , maGraphicController(*mpGraphic, SID_GRAPHIC_SM, pFrame_->GetBindings())
+    , mxGraphicWindow(VclPtr<SmGraphicWindow>::Create(*this))
+    , maGraphicController(mxGraphicWindow->GetGraphicWidget(), SID_GRAPHIC_SM, pFrame_->GetBindings())
     , mbPasteState(false)
     , mbInsertIntoEditWindow(false)
 {
     SetStatusText(OUString());
-    SetWindow(mpGraphic.get());
+    SetWindow(mxGraphicWindow.get());
     SfxShell::SetName("SmView");
     SfxShell::SetUndoManager( &GetDoc()->GetEditEngine().GetUndoManager() );
 }
 
-
 SmViewShell::~SmViewShell()
 {
     //!! this view shell is not active anymore !!
@@ -1909,7 +2060,7 @@ SmViewShell::~SmViewShell()
     SmEditWindow *pEditWin = GetEditWindow();
     if (pEditWin)
         pEditWin->DeleteEditView();
-    mpGraphic.disposeAndClear();
+    mxGraphicWindow.disposeAndClear();
 }
 
 void SmViewShell::Deactivate( bool bIsMDIActivate )
@@ -1995,11 +2146,11 @@ void SmViewShell::ZoomByItemSet(const SfxItemSet *pSet)
     switch( rZoom.GetType() )
     {
         case SvxZoomType::PERCENT:
-            mpGraphic->SetZoom(sal::static_int_cast<sal_uInt16>(rZoom.GetValue ()));
+            mxGraphicWindow->SetZoom(sal::static_int_cast<sal_uInt16>(rZoom.GetValue ()));
             break;
 
         case SvxZoomType::OPTIMAL:
-            mpGraphic->ZoomToFitInWindow();
+            mxGraphicWindow->ZoomToFitInWindow();
             break;
 
         case SvxZoomType::PAGEWIDTH:
@@ -2013,7 +2164,7 @@ void SmViewShell::ZoomByItemSet(const SfxItemSet *pSet)
             Size       GraphicSize(pPrinter->LogicToPixel(GetDoc()->GetSize(), aMap));
             sal_uInt16 nZ = sal::static_int_cast<sal_uInt16>(std::min(tools::Long(Fraction(OutputSize.Width()  * 100, GraphicSize.Width())),
                                                                       tools::Long(Fraction(OutputSize.Height() * 100, GraphicSize.Height()))));
-            mpGraphic->SetZoom (nZ);
+            mxGraphicWindow->SetZoom(nZ);
             break;
         }
         default:
diff --git a/starmath/uiconfig/smath/ui/mathwindow.ui b/starmath/uiconfig/smath/ui/mathwindow.ui
new file mode 100644
index 000000000000..3737c0d63791
--- /dev/null
+++ b/starmath/uiconfig/smath/ui/mathwindow.ui
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sm">
+  <requires lib="gtk+" version="3.20"/>
+  <object class="GtkBox" id="MathWindow">
+    <property name="visible">True</property>
+    <property name="can-focus">False</property>
+    <property name="hexpand">True</property>
+    <property name="vexpand">True</property>
+    <property name="spacing">6</property>
+    <child>
+      <object class="GtkScrolledWindow" id="scrolledwindow">
+        <property name="visible">True</property>
+        <property name="can-focus">True</property>
+        <property name="border-width">0</property>
+        <property name="shadow-type">etched-out</property>
+        <child>
+          <object class="GtkViewport">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <child>
+              <object class="GtkDrawingArea" id="mathview">
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_SCROLL_MASK</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/starmath/visual-editor-todo b/starmath/visual-editor-todo
index 65f2d7a7b6a0..7e3cc5d24dc1 100644
--- a/starmath/visual-editor-todo
+++ b/starmath/visual-editor-todo
@@ -12,7 +12,7 @@ on IRC (jopsen) or e-mail me at jopsen at gmail.com.
 
 Easy
 ----
-1. SmGraphicWindow::KeyInput relies on comparison of char, a better way must be available for CTRL+c
+1. SmGraphicWidget::KeyInput relies on comparison of char, a better way must be available for CTRL+c
 2. Code style (missing spaces, linebreaks and a few renames)
 3. More documentation
 4. Extend NodeToTextVisitor to update token offsets so SmNode::GetRow and SmNode::GetColumn will work.


More information about the Libreoffice-commits mailing list