summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-04-19 15:22:22 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-04-21 18:02:15 +0200
commitea21b870f8549d0110ef65187af50694a06458ca (patch)
tree0d0c2d203e80a5f94bfeaad0e1c373ff2e1b20cd /starmath
parent967da14b48035f5acdd8a604a5c33cc6fe37035a (diff)
weld SmGraphicWindow
Change-Id: Ie163640d6453f30d1cebdaf75ecd41374b2b9ec3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114351 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'starmath')
-rw-r--r--starmath/Library_sm.mk1
-rw-r--r--starmath/UIConfig_smath.mk1
-rw-r--r--starmath/inc/scrwin.hxx68
-rw-r--r--starmath/inc/view.hxx111
-rw-r--r--starmath/source/accessibility.cxx203
-rw-r--r--starmath/source/accessibility.hxx4
-rw-r--r--starmath/source/cursor.cxx2
-rw-r--r--starmath/source/document.cxx10
-rw-r--r--starmath/source/edit.cxx4
-rw-r--r--starmath/source/scrwin.cxx345
-rw-r--r--starmath/source/view.cxx483
-rw-r--r--starmath/uiconfig/smath/ui/mathwindow.ui38
-rw-r--r--starmath/visual-editor-todo2
13 files changed, 549 insertions, 723 deletions
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@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.