diff options
Diffstat (limited to 'starmath')
-rw-r--r-- | starmath/Library_sm.mk | 3 | ||||
-rw-r--r-- | starmath/inc/AccessibleSmElement.hxx | 101 | ||||
-rw-r--r-- | starmath/inc/AccessibleSmElementsControl.hxx | 106 | ||||
-rw-r--r-- | starmath/inc/ElementsDockingWindow.hxx | 106 | ||||
-rw-r--r-- | starmath/source/AccessibleSmElement.cxx | 281 | ||||
-rw-r--r-- | starmath/source/AccessibleSmElementsControl.cxx | 369 | ||||
-rw-r--r-- | starmath/source/ElementsDockingWindow.cxx | 841 | ||||
-rw-r--r-- | starmath/source/SmElementsPanel.cxx | 14 | ||||
-rw-r--r-- | starmath/source/SmElementsPanel.hxx | 3 | ||||
-rw-r--r-- | starmath/source/uiobject.cxx | 106 | ||||
-rw-r--r-- | starmath/source/uiobject.hxx | 57 | ||||
-rw-r--r-- | starmath/uiconfig/smath/ui/dockingelements.ui | 40 | ||||
-rw-r--r-- | starmath/uiconfig/smath/ui/sidebarelements_math.ui | 42 |
13 files changed, 165 insertions, 1904 deletions
diff --git a/starmath/Library_sm.mk b/starmath/Library_sm.mk index e4eca13440d7..aa824cee5890 100644 --- a/starmath/Library_sm.mk +++ b/starmath/Library_sm.mk @@ -64,8 +64,6 @@ $(eval $(call gb_Library_use_libraries,sm,\ )) $(eval $(call gb_Library_add_exception_objects,sm,\ - starmath/source/AccessibleSmElement \ - starmath/source/AccessibleSmElementsControl \ starmath/source/ElementsDockingWindow \ starmath/source/SmElementsPanel \ starmath/source/SmPanelFactory \ @@ -94,7 +92,6 @@ $(eval $(call gb_Library_add_exception_objects,sm,\ starmath/source/symbol \ starmath/source/tmpdevice \ starmath/source/typemap \ - starmath/source/uiobject \ starmath/source/unodoc \ starmath/source/unofilter \ starmath/source/unomodel \ diff --git a/starmath/inc/AccessibleSmElement.hxx b/starmath/inc/AccessibleSmElement.hxx deleted file mode 100644 index c1e7e6526872..000000000000 --- a/starmath/inc/AccessibleSmElement.hxx +++ /dev/null @@ -1,101 +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 <com/sun/star/accessibility/XAccessible.hpp> -#include <com/sun/star/accessibility/XAccessibleAction.hpp> -#include <com/sun/star/accessibility/XAccessibleContext.hpp> -#include <com/sun/star/accessibility/XAccessibleStateSet.hpp> -#include <com/sun/star/awt/Rectangle.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <cppuhelper/implbase3.hxx> -#include <comphelper/accessiblecomponenthelper.hxx> -#include <sal/types.h> - -class SmElementsControl; - -typedef ::cppu::ImplHelper3<css::lang::XServiceInfo, css::accessibility::XAccessible, - css::accessibility::XAccessibleAction> - AccessibleSmElement_BASE; - -class AccessibleSmElement final : public comphelper::OAccessibleComponentHelper, - public AccessibleSmElement_BASE -{ - SmElementsControl* m_pSmElementsControl; - const sal_Int32 m_nIndexInParent; ///< index in the parent XAccessible - const sal_uInt16 m_nItemId; ///< index in the SmElementsControl - bool m_bHasFocus; - sal_Int16 m_nRole; - - ~AccessibleSmElement() override; - void SAL_CALL disposing() override; - css::awt::Rectangle implGetBounds() override; - - void testAction(sal_Int32) const; - -public: - explicit AccessibleSmElement(SmElementsControl* pSmElementsControl, sal_uInt16 nItemId, - sal_Int32 nIndexInParent); - - void SetFocus(bool _bFocus); - sal_uInt16 itemId() const { return m_nItemId; } - - DECLARE_XINTERFACE() - DECLARE_XTYPEPROVIDER() - - // XAccessible - css::uno::Reference<css::accessibility::XAccessibleContext> - SAL_CALL getAccessibleContext() override; - - // XServiceInfo - OUString SAL_CALL getImplementationName() override; - sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override; - css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; - - // XAccessibleContext - sal_Int32 SAL_CALL getAccessibleChildCount() override; - css::uno::Reference<css::accessibility::XAccessible> - SAL_CALL getAccessibleChild(sal_Int32 i) override; - css::uno::Reference<css::accessibility::XAccessible> SAL_CALL getAccessibleParent() override; - sal_Int32 SAL_CALL getAccessibleIndexInParent() override; - sal_Int16 SAL_CALL getAccessibleRole() override; - OUString SAL_CALL getAccessibleDescription() override; - OUString SAL_CALL getAccessibleName() override; - css::uno::Reference<css::accessibility::XAccessibleRelationSet> - SAL_CALL getAccessibleRelationSet() override; - css::uno::Reference<css::accessibility::XAccessibleStateSet> - SAL_CALL getAccessibleStateSet() override; - - // XAccessibleComponent - css::uno::Reference<css::accessibility::XAccessible> - SAL_CALL getAccessibleAtPoint(const css::awt::Point& aPoint) override; - void SAL_CALL grabFocus() override; - sal_Int32 SAL_CALL getForeground() override; - sal_Int32 SAL_CALL getBackground() override; - - // XAccessibleAction - sal_Int32 SAL_CALL getAccessibleActionCount() override; - sal_Bool SAL_CALL doAccessibleAction(sal_Int32 nIndex) override; - OUString SAL_CALL getAccessibleActionDescription(sal_Int32 nIndex) override; - css::uno::Reference<css::accessibility::XAccessibleKeyBinding> - SAL_CALL getAccessibleActionKeyBinding(sal_Int32 nIndex) override; -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/starmath/inc/AccessibleSmElementsControl.hxx b/starmath/inc/AccessibleSmElementsControl.hxx deleted file mode 100644 index bdb5e25ea724..000000000000 --- a/starmath/inc/AccessibleSmElementsControl.hxx +++ /dev/null @@ -1,106 +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 <comphelper/accessiblecomponenthelper.hxx> -#include <com/sun/star/accessibility/XAccessibleSelection.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <cppuhelper/implbase3.hxx> -#include <rtl/ref.hxx> - -#include <vector> - -class AccessibleSmElement; -class SmElementsControl; - -typedef ::cppu::ImplHelper3<css::lang::XServiceInfo, css::accessibility::XAccessible, - css::accessibility::XAccessibleSelection> - AccessibleSmElementsControl_BASE; - -class AccessibleSmElementsControl final : public comphelper::OAccessibleComponentHelper, - public AccessibleSmElementsControl_BASE -{ - std::vector<rtl::Reference<AccessibleSmElement>> m_aAccessibleChildren; - SmElementsControl* m_pControl; - - void UpdateFocus(sal_uInt16); - inline void TestControl(); - - ~AccessibleSmElementsControl() override; - void SAL_CALL disposing() override; - css::awt::Rectangle implGetBounds() override; - -public: - AccessibleSmElementsControl(SmElementsControl& rControl); - - void ReleaseAllItems(); - void AddAllItems(); - inline void AcquireFocus(); - inline void ReleaseFocus(sal_uInt16); - - DECLARE_XINTERFACE() - DECLARE_XTYPEPROVIDER() - - // XAccessible - css::uno::Reference<css::accessibility::XAccessibleContext> - SAL_CALL getAccessibleContext() override; - - // XServiceInfo - OUString SAL_CALL getImplementationName() override; - sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; - css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; - - // XAccessibleComponent - sal_Bool SAL_CALL containsPoint(const css::awt::Point& aPoint) override; - css::uno::Reference<css::accessibility::XAccessible> - SAL_CALL getAccessibleAtPoint(const css::awt::Point& aPoint) override; - void SAL_CALL grabFocus() override; - sal_Int32 SAL_CALL getForeground() override; - sal_Int32 SAL_CALL getBackground() override; - - // XAccessibleContext - sal_Int32 SAL_CALL getAccessibleChildCount() override; - css::uno::Reference<css::accessibility::XAccessible> - SAL_CALL getAccessibleChild(sal_Int32 i) override; - css::uno::Reference<css::accessibility::XAccessible> SAL_CALL getAccessibleParent() override; - sal_Int16 SAL_CALL getAccessibleRole() override; - OUString SAL_CALL getAccessibleDescription() override; - OUString SAL_CALL getAccessibleName() override; - css::uno::Reference<css::accessibility::XAccessibleRelationSet> - SAL_CALL getAccessibleRelationSet() override; - css::uno::Reference<css::accessibility::XAccessibleStateSet> - SAL_CALL getAccessibleStateSet() override; - - // XAccessibleSelection - void SAL_CALL selectAccessibleChild(sal_Int32 nChildIndex) override; - sal_Bool SAL_CALL isAccessibleChildSelected(sal_Int32 nChildIndex) override; - void SAL_CALL clearAccessibleSelection() override; - void SAL_CALL selectAllAccessibleChildren() override; - sal_Int32 SAL_CALL getSelectedAccessibleChildCount() override; - css::uno::Reference<css::accessibility::XAccessible> - SAL_CALL getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex) override; - void SAL_CALL deselectAccessibleChild(sal_Int32 nChildIndex) override; -}; - -void AccessibleSmElementsControl::AcquireFocus() { UpdateFocus(SAL_MAX_UINT16); } - -void AccessibleSmElementsControl::ReleaseFocus(sal_uInt16 nPos) { UpdateFocus(nPos); } - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/starmath/inc/ElementsDockingWindow.hxx b/starmath/inc/ElementsDockingWindow.hxx index 28a564f7a1e7..859b7b73a826 100644 --- a/starmath/inc/ElementsDockingWindow.hxx +++ b/starmath/inc/ElementsDockingWindow.hxx @@ -26,90 +26,44 @@ #include "node.hxx" #include "parsebase.hxx" -#include "AccessibleSmElementsControl.hxx" -class SmDocShell; - -class SmElement -{ - std::unique_ptr<SmNode> mpNode; - OUString maText; - OUString maHelpText; - -public: - Point mBoxLocation; - Size mBoxSize; - - SmElement(std::unique_ptr<SmNode>&& pNode, const OUString& aText, const OUString& aHelpText); - virtual ~SmElement(); - - const std::unique_ptr<SmNode>& getNode() const; - const OUString& getText() const { return maText; } - const OUString& getHelpText() const { return maHelpText; } +#include <memory> +#include <vector> - virtual bool isSeparator() const { return false; } -}; - -class SmElementSeparator final : public SmElement -{ -public: - SmElementSeparator(); - - bool isSeparator() const override { return true; } -}; +class SmDocShell; +class SvTreeListBox; +struct ElementData; -class SmElementsControl : public weld::CustomWidgetController +class SmElementsControl { - friend class ElementSelectorUIObject; - friend class ElementUIObject; - std::unique_ptr<AbstractSmParser> maParser; - virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override; - virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; - virtual bool MouseMove(const MouseEvent& rMEvt) override; - virtual OUString RequestHelp(tools::Rectangle& rRect) override; - virtual void Resize() override; - virtual void GetFocus() override; - virtual void LoseFocus() override; - virtual bool KeyInput(const KeyEvent& rKEvt) override; - css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override; - SmDocShell* mpDocShell; SmFormat maFormat; TranslateId msCurrentSetId; - sal_uInt16 m_nCurrentElement; - sal_uInt16 m_nCurrentRolloverElement; - sal_uInt16 m_nCurrentOffset; sal_uInt16 m_nSmSyntaxVersion; - Link<SmElement&,void> maSelectHdlLink; - std::vector< std::unique_ptr<SmElement> > maElementList; - Size maMaxElementDimensions; bool mbVerticalMode; - std::unique_ptr<weld::ScrolledWindow> mxScroll; - bool m_bFirstPaintAfterLayout; - rtl::Reference<AccessibleSmElementsControl> m_xAccessible; + std::vector<std::unique_ptr<ElementData>> maItemDatas; + std::unique_ptr<weld::IconView> mpIconView; - void addElement(const OUString& aElementVisual, const OUString& aElementSource, const OUString& aHelpText); - SmElement* current() const; - void setCurrentElement(sal_uInt16); - bool hasRollover() const { return m_nCurrentRolloverElement != SAL_MAX_UINT16; } + Link<OUString, void> maSelectHdlLink; - void stepFocus(const bool bBackward); - void pageFocus(const bool bBackward); - // common code of page and step focus - inline void scrollToElement(const bool, const SmElement*); - inline sal_uInt16 nextElement(const bool, const sal_uInt16, const sal_uInt16); + void addElement(const OUString& aElementVisual, const OUString& aElementSource, const OUString& aHelpText); + void addElements(const TranslateId& rCategory); void build(); - //if bDraw is true, then draw, otherwise just layout - void LayoutOrPaintContents(vcl::RenderContext& rContext, bool bDraw); + DECL_LINK(QueryTooltipHandler, const weld::TreeIter&, OUString); + DECL_LINK(ElementActivatedHandler, weld::IconView&, bool); + + static OUString GetElementSource(const OUString& itemId); + static OUString GetElementHelpText(const OUString& itemId); public: - explicit SmElementsControl(std::unique_ptr<weld::ScrolledWindow> xScrolledWindow); - virtual ~SmElementsControl() override; + + explicit SmElementsControl(std::unique_ptr<weld::IconView> pIconView); + ~SmElementsControl(); static const std::vector<TranslateId>& categories(); const TranslateId& elementSetId() const { return msCurrentSetId; } @@ -117,41 +71,23 @@ public: void setVerticalMode(bool bVertical); - sal_uInt16 itemCount() const; - sal_uInt16 itemHighlighted() const; - sal_uInt16 itemAtPos(const Point& rPos) const; - tools::Rectangle itemPosRect(sal_uInt16) const; - bool itemIsSeparator(sal_uInt16) const; - bool itemIsVisible(sal_uInt16) const; - OUString itemName(sal_uInt16) const; - bool itemTrigger(sal_uInt16); - void setItemHighlighted(sal_uInt16); void setSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion); - sal_uInt16 itemOffset() const { return m_nCurrentOffset; } - virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; + void SetSelectHdl(const Link<OUString, void>& rLink) { maSelectHdlLink = rLink; } - DECL_LINK( ScrollHdl, weld::ScrolledWindow&, void ); - - void SetSelectHdl(const Link<SmElement&,void>& rLink) { maSelectHdlLink = rLink; } - - const rtl::Reference<AccessibleSmElementsControl> & GetAccessible() const { return m_xAccessible; } static Color GetTextColor(); static Color GetControlBackground(); - - virtual FactoryFunction GetUITestFactory() const override; }; class SmElementsDockingWindow final : public SfxDockingWindow { std::unique_ptr<SmElementsControl> mxElementsControl; - std::unique_ptr<weld::CustomWeld> mxElementsControlWin; std::unique_ptr<weld::ComboBox> mxElementListBox; virtual void Resize() override; SmViewShell* GetView(); - DECL_LINK(SelectClickHandler, SmElement&, void); + DECL_LINK(SelectClickHandler, OUString, void); DECL_LINK(ElementSelectedHandle, weld::ComboBox&, void); public: diff --git a/starmath/source/AccessibleSmElement.cxx b/starmath/source/AccessibleSmElement.cxx deleted file mode 100644 index 30d19cc8afc3..000000000000 --- a/starmath/source/AccessibleSmElement.cxx +++ /dev/null @@ -1,281 +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 <AccessibleSmElement.hxx> -#include <ElementsDockingWindow.hxx> - -#include <com/sun/star/accessibility/AccessibleEventId.hpp> -#include <com/sun/star/accessibility/AccessibleRole.hpp> -#include <com/sun/star/accessibility/AccessibleStateType.hpp> -#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> -#include <cppuhelper/supportsservice.hxx> -#include <toolkit/helper/convert.hxx> -#include <unotools/accessiblerelationsethelper.hxx> -#include <unotools/accessiblestatesethelper.hxx> - -using namespace ::com::sun::star::accessibility; -using namespace ::com::sun::star; -using OContextEntryGuard = ::comphelper::OContextEntryGuard; -using OExternalLockGuard = ::comphelper::OExternalLockGuard; - -AccessibleSmElement::AccessibleSmElement(SmElementsControl* pSmElementsControl, sal_uInt16 nItemId, - sal_Int32 nIndexInParent) - : m_pSmElementsControl(pSmElementsControl) - , m_nIndexInParent(nIndexInParent) - , m_nItemId(nItemId) - , m_bHasFocus(false) -{ - assert(m_pSmElementsControl); - m_nRole = m_pSmElementsControl->itemIsSeparator(m_nItemId) ? AccessibleRole::SEPARATOR - : AccessibleRole::PUSH_BUTTON; -} - -AccessibleSmElement::~AccessibleSmElement() {} - -void AccessibleSmElement::SetFocus(bool bFocus) -{ - if (m_bHasFocus == bFocus) - return; - - uno::Any aOldValue; - uno::Any aNewValue; - if (m_bHasFocus) - aOldValue <<= AccessibleStateType::FOCUSED; - else - aNewValue <<= AccessibleStateType::FOCUSED; - m_bHasFocus = bFocus; - NotifyAccessibleEvent(AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue); -} - -awt::Rectangle AccessibleSmElement::implGetBounds() -{ - awt::Rectangle aRect; - if (m_pSmElementsControl) - aRect = AWTRectangle(m_pSmElementsControl->itemPosRect(m_nItemId)); - return aRect; -} - -// XInterface - -IMPLEMENT_FORWARD_REFCOUNT(AccessibleSmElement, comphelper::OAccessibleComponentHelper) - -uno::Any AccessibleSmElement::queryInterface(const uno::Type& _rType) -{ - if (_rType == cppu::UnoType<XAccessibleAction>::get() - && (!m_pSmElementsControl || m_pSmElementsControl->itemIsSeparator(m_nItemId))) - return uno::Any(); - - uno::Any aReturn = comphelper::OAccessibleComponentHelper::queryInterface(_rType); - if (!aReturn.hasValue()) - aReturn = AccessibleSmElement_BASE::queryInterface(_rType); - return aReturn; -} - -// XTypeProvider - -IMPLEMENT_FORWARD_XTYPEPROVIDER2(AccessibleSmElement, comphelper::OAccessibleComponentHelper, - AccessibleSmElement_BASE) - -// XComponent - -void AccessibleSmElement::disposing() -{ - comphelper::OAccessibleComponentHelper::disposing(); - m_pSmElementsControl = nullptr; -} - -// XServiceInfo - -OUString AccessibleSmElement::getImplementationName() -{ - return "com.sun.star.comp.toolkit.AccessibleSmElement"; -} - -sal_Bool AccessibleSmElement::supportsService(const OUString& rServiceName) -{ - return cppu::supportsService(this, rServiceName); -} - -uno::Sequence<OUString> AccessibleSmElement::getSupportedServiceNames() -{ - return { "com.sun.star.accessibility.AccessibleContext", - "com.sun.star.accessibility.AccessibleComponent", - "com.sun.star.accessibility.AccessibleSmElement" }; -} - -// XAccessible - -uno::Reference<XAccessibleContext> AccessibleSmElement::getAccessibleContext() { return this; } - -// XAccessibleContext - -sal_Int32 AccessibleSmElement::getAccessibleChildCount() { return 0; } - -uno::Reference<accessibility::XAccessible> AccessibleSmElement::getAccessibleChild(sal_Int32) -{ - return uno::Reference<XAccessible>(); -} - -uno::Reference<XAccessible> AccessibleSmElement::getAccessibleParent() -{ - OContextEntryGuard aGuard(this); - uno::Reference<XAccessible> xParent; - if (m_pSmElementsControl) - xParent = m_pSmElementsControl->GetAccessible(); - return xParent; -} - -sal_Int32 AccessibleSmElement::getAccessibleIndexInParent() -{ - OContextEntryGuard aGuard(this); - return m_nIndexInParent; -} - -sal_Int16 AccessibleSmElement::getAccessibleRole() -{ - OContextEntryGuard aGuard(this); - return m_nRole; -} - -OUString AccessibleSmElement::getAccessibleDescription() { return getAccessibleName(); } - -OUString AccessibleSmElement::getAccessibleName() -{ - OExternalLockGuard aGuard(this); - OUString aName; - if (m_pSmElementsControl) - aName = m_pSmElementsControl->itemName(m_nItemId); - return aName; -} - -uno::Reference<XAccessibleRelationSet> AccessibleSmElement::getAccessibleRelationSet() -{ - OContextEntryGuard aGuard(this); - - return new utl::AccessibleRelationSetHelper; -} - -uno::Reference<XAccessibleStateSet> AccessibleSmElement::getAccessibleStateSet() -{ - OExternalLockGuard aGuard(this); - - rtl::Reference<utl::AccessibleStateSetHelper> pStateSetHelper - = new utl::AccessibleStateSetHelper; - - if (m_pSmElementsControl && !rBHelper.bDisposed && !rBHelper.bInDispose) - { - if (m_pSmElementsControl->itemIsVisible(m_nItemId)) - pStateSetHelper->AddState(AccessibleStateType::VISIBLE); - if (!m_pSmElementsControl->itemIsSeparator(m_nItemId)) - { - if (m_pSmElementsControl->IsEnabled()) - { - pStateSetHelper->AddState(AccessibleStateType::ENABLED); - pStateSetHelper->AddState(AccessibleStateType::SENSITIVE); - } - pStateSetHelper->AddState(AccessibleStateType::FOCUSABLE); - if (m_bHasFocus) - pStateSetHelper->AddState(AccessibleStateType::FOCUSED); - } - } - else - pStateSetHelper->AddState(AccessibleStateType::DEFUNC); - - return pStateSetHelper; -} - -// XAccessibleComponent - -uno::Reference<XAccessible> AccessibleSmElement::getAccessibleAtPoint(const awt::Point&) -{ - return uno::Reference<XAccessible>(); -} - -void AccessibleSmElement::grabFocus() -{ - uno::Reference<XAccessible> xParent(getAccessibleParent()); - - if (xParent.is()) - { - uno::Reference<XAccessibleSelection> rxAccessibleSelection(xParent->getAccessibleContext(), - uno::UNO_QUERY); - if (rxAccessibleSelection.is()) - rxAccessibleSelection->selectAccessibleChild(getAccessibleIndexInParent()); - } -} - -sal_Int32 AccessibleSmElement::getForeground() -{ - OExternalLockGuard aGuard(this); - - Color nColor = SmElementsControl::GetTextColor(); - return sal_Int32(nColor); -} - -sal_Int32 AccessibleSmElement::getBackground() -{ - OExternalLockGuard aGuard(this); - - Color nColor = SmElementsControl::GetControlBackground(); - return sal_Int32(nColor); -} - -// XAccessibleAction - -sal_Int32 AccessibleSmElement::getAccessibleActionCount() -{ - // only one action -> "Press" - return m_pSmElementsControl->itemIsSeparator(m_nItemId) ? 0 : 1; -} - -void AccessibleSmElement::testAction(sal_Int32 nIndex) const -{ - if (!m_pSmElementsControl || m_pSmElementsControl->itemIsSeparator(m_nItemId) || (nIndex != 0)) - throw lang::IndexOutOfBoundsException(); -} - -sal_Bool AccessibleSmElement::doAccessibleAction(sal_Int32 nIndex) -{ - OExternalLockGuard aGuard(this); - - testAction(nIndex); - - return m_pSmElementsControl->itemTrigger(m_nItemId); -} - -OUString AccessibleSmElement::getAccessibleActionDescription(sal_Int32 nIndex) -{ - OExternalLockGuard aGuard(this); - - testAction(nIndex); - - return "press"; -} - -uno::Reference<XAccessibleKeyBinding> -AccessibleSmElement::getAccessibleActionKeyBinding(sal_Int32 nIndex) -{ - OContextEntryGuard aGuard(this); - - testAction(nIndex); - - return uno::Reference<XAccessibleKeyBinding>(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/starmath/source/AccessibleSmElementsControl.cxx b/starmath/source/AccessibleSmElementsControl.cxx deleted file mode 100644 index 1017d8468686..000000000000 --- a/starmath/source/AccessibleSmElementsControl.cxx +++ /dev/null @@ -1,369 +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 <AccessibleSmElementsControl.hxx> -#include <AccessibleSmElement.hxx> -#include <ElementsDockingWindow.hxx> -#include <smmod.hxx> - -#include <com/sun/star/accessibility/AccessibleEventId.hpp> -#include <com/sun/star/accessibility/AccessibleRole.hpp> -#include <com/sun/star/accessibility/AccessibleStateType.hpp> -#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> -#include <cppuhelper/supportsservice.hxx> -#include <o3tl/safeint.hxx> -#include <toolkit/helper/convert.hxx> -#include <unotools/accessiblerelationsethelper.hxx> -#include <unotools/accessiblestatesethelper.hxx> -#include <vcl/svapp.hxx> - -using namespace ::com::sun::star; -using namespace ::com::sun::star::accessibility; -using OContextEntryGuard = ::comphelper::OContextEntryGuard; -using OExternalLockGuard = ::comphelper::OExternalLockGuard; - -// AccessibleSmElementsControl - -AccessibleSmElementsControl::AccessibleSmElementsControl(SmElementsControl& rControl) - : m_pControl(&rControl) -{ -} - -AccessibleSmElementsControl::~AccessibleSmElementsControl() {} - -void AccessibleSmElementsControl::UpdateFocus(sal_uInt16 nPos) -{ - const bool bSetFocus = (nPos == SAL_MAX_UINT16); - - // submit events only if the widget has the focus to avoid sending events due to mouse move - if (!m_pControl || (bSetFocus && !m_pControl->HasFocus())) - return; - - if (bSetFocus) - nPos = m_pControl->itemHighlighted() - m_pControl->itemOffset(); - - if (nPos < m_aAccessibleChildren.size()) - { - const auto& rxChild = m_aAccessibleChildren[nPos]; - if (rxChild.is()) - rxChild->SetFocus(bSetFocus); - } -} - -void AccessibleSmElementsControl::ReleaseAllItems() -{ - if (m_aAccessibleChildren.empty()) - return; - - m_aAccessibleChildren.clear(); - - // The original toolbox accessibility code uses individual NAME_CHANGED - // events in a loop. We can't do this, because on each remove event the - // list of known children is rebuild. But since we rely on the child - // count of the SmElementsControl, we'll always have no or all items. - // In the latter case this would automatically recreate all items! - assert(m_pControl && m_pControl->itemCount() == 0); - NotifyAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN, uno::Any(), uno::Any()); -} - -void AccessibleSmElementsControl::AddAllItems() -{ - assert(m_pControl); - if (!m_pControl) - return; - - uno::Any aNewName(getAccessibleName()); - NotifyAccessibleEvent(AccessibleEventId::NAME_CHANGED, uno::Any(), aNewName); - - // register the new items - sal_uInt16 nCount = getAccessibleChildCount(); - for (sal_uInt16 i = 0; i < nCount; ++i) - { - uno::Any aNewValue; - aNewValue <<= getAccessibleChild(static_cast<sal_Int32>(i)); - NotifyAccessibleEvent(AccessibleEventId::CHILD, uno::Any(), aNewValue); - } -} - -IMPLEMENT_FORWARD_XINTERFACE2(AccessibleSmElementsControl, comphelper::OAccessibleComponentHelper, - AccessibleSmElementsControl_BASE) - -IMPLEMENT_FORWARD_XTYPEPROVIDER2(AccessibleSmElementsControl, - comphelper::OAccessibleComponentHelper, - AccessibleSmElementsControl_BASE) - -// XAccessible -uno::Reference<XAccessibleContext> AccessibleSmElementsControl::getAccessibleContext() -{ - return this; -} - -// XComponent -void AccessibleSmElementsControl::disposing() -{ - comphelper::OAccessibleComponentHelper::disposing(); - m_aAccessibleChildren.clear(); -} - -void AccessibleSmElementsControl::grabFocus() -{ - SolarMutexGuard aGuard; - if (!m_pControl) - throw uno::RuntimeException(); - - m_pControl->GrabFocus(); -} - -sal_Int32 AccessibleSmElementsControl::getForeground() -{ - SolarMutexGuard aGuard; - - return static_cast<sal_Int32>(SmElementsControl::GetTextColor()); -} - -sal_Int32 AccessibleSmElementsControl::getBackground() -{ - SolarMutexGuard aGuard; - - Color nCol = SmElementsControl::GetControlBackground(); - return static_cast<sal_Int32>(nCol); -} - -// XServiceInfo -OUString AccessibleSmElementsControl::getImplementationName() -{ - return "com.sun.star.comp.toolkit.AccessibleSmElementsControl"; -} - -sal_Bool AccessibleSmElementsControl::supportsService(const OUString& rServiceName) -{ - return cppu::supportsService(this, rServiceName); -} - -uno::Sequence<OUString> AccessibleSmElementsControl::getSupportedServiceNames() -{ - return { "com.sun.star.accessibility.AccessibleContext", - "com.sun.star.accessibility.AccessibleComponent", - "com.sun.star.accessibility.AccessibleSelection", - "com.sun.star.accessibility.AccessibleSmElementsControl" }; -} - -// XAccessibleContext -sal_Int32 AccessibleSmElementsControl::getAccessibleChildCount() -{ - comphelper::OExternalLockGuard aGuard(this); - sal_Int32 nCount = 0; - if (m_pControl) - { - nCount = m_pControl->itemCount(); - if (m_aAccessibleChildren.size() != sal_uInt16(nCount)) - m_aAccessibleChildren.resize(nCount); - } - return nCount; -} - -uno::Reference<XAccessible> AccessibleSmElementsControl::getAccessibleChild(sal_Int32 c) -{ - comphelper::OExternalLockGuard aGuard(this); - - if (c < 0 || c >= getAccessibleChildCount()) - throw lang::IndexOutOfBoundsException(); - - rtl::Reference<AccessibleSmElement> xChild = m_aAccessibleChildren[c]; - const sal_uInt16 nItemId = m_pControl->itemOffset() + c; - if (xChild.is() && xChild->itemId() != nItemId) - xChild.clear(); - if (!xChild.is()) - { - sal_uInt16 nHighlightItemId = m_pControl->itemHighlighted(); - rtl::Reference<AccessibleSmElement> pChild - = new AccessibleSmElement(m_pControl, nItemId, c); - if (pChild->itemId() == nHighlightItemId) - pChild->SetFocus(true); - m_aAccessibleChildren[c] = pChild; - xChild = pChild; - } - return xChild; -} - -uno::Reference<XAccessible> AccessibleSmElementsControl::getAccessibleParent() -{ - SolarMutexGuard aGuard; - if (!m_pControl) - throw uno::RuntimeException(); - - return m_pControl->GetDrawingArea()->get_accessible_parent(); -} - -uno::Reference<XAccessible> -AccessibleSmElementsControl::getAccessibleAtPoint(const awt::Point& rPoint) -{ - comphelper::OExternalLockGuard aGuard(this); - - uno::Reference<XAccessible> xAccessible; - if (m_pControl) - { - sal_uInt16 nPos = m_pControl->itemAtPos(VCLPoint(rPoint)); - nPos -= m_pControl->itemOffset(); - if (nPos <= m_aAccessibleChildren.size()) - xAccessible = getAccessibleChild(nPos); - } - return xAccessible; -} - -sal_Int16 AccessibleSmElementsControl::getAccessibleRole() { return AccessibleRole::SCROLL_PANE; } - -OUString AccessibleSmElementsControl::getAccessibleDescription() { return OUString(); } - -OUString AccessibleSmElementsControl::getAccessibleName() -{ - SolarMutexGuard aGuard; - OUString aName; - if (m_pControl && m_pControl->elementSetId()) - aName = SmResId(m_pControl->elementSetId()); - return aName; -} - -// XAccessibleSelection -void AccessibleSmElementsControl::selectAccessibleChild(sal_Int32 nChildIndex) -{ - OExternalLockGuard aGuard(this); - - if ((!m_pControl) || nChildIndex < 0 - || o3tl::make_unsigned(nChildIndex) >= m_aAccessibleChildren.size()) - throw lang::IndexOutOfBoundsException(); - - m_pControl->setItemHighlighted(nChildIndex); -} - -sal_Bool AccessibleSmElementsControl::isAccessibleChildSelected(sal_Int32 nChildIndex) -{ - OExternalLockGuard aGuard(this); - if ((!m_pControl) || nChildIndex < 0 - || o3tl::make_unsigned(nChildIndex) >= m_aAccessibleChildren.size()) - throw lang::IndexOutOfBoundsException(); - - return (m_pControl->itemHighlighted() == nChildIndex); -} - -void AccessibleSmElementsControl::clearAccessibleSelection() -{ - OExternalLockGuard aGuard(this); - if (m_pControl) - m_pControl->setItemHighlighted(SAL_MAX_UINT16); -} - -void AccessibleSmElementsControl::selectAllAccessibleChildren() -{ - // intentionally empty -} - -sal_Int32 AccessibleSmElementsControl::getSelectedAccessibleChildCount() -{ - OExternalLockGuard aGuard(this); - - sal_Int32 nRet = 0; - if (m_pControl - && (m_pControl->itemHighlighted() - m_pControl->itemOffset()) < getAccessibleChildCount()) - nRet = 1; - return nRet; -} - -uno::Reference<XAccessible> -AccessibleSmElementsControl::getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex) -{ - OExternalLockGuard aGuard(this); - if (nSelectedChildIndex != 0 || !m_pControl) - throw lang::IndexOutOfBoundsException(); - return getAccessibleChild(m_pControl->itemHighlighted() - m_pControl->itemOffset()); -} - -void AccessibleSmElementsControl::deselectAccessibleChild(sal_Int32 nChildIndex) -{ - OExternalLockGuard aGuard(this); - if (nChildIndex != 0 || nChildIndex >= getAccessibleChildCount()) - throw lang::IndexOutOfBoundsException(); - clearAccessibleSelection(); // there can be just one selected child -} - -void AccessibleSmElementsControl::TestControl() -{ - if (!m_pControl) - throw uno::RuntimeException(); -} - -awt::Rectangle AccessibleSmElementsControl::implGetBounds() -{ - SolarMutexGuard aGuard; - TestControl(); - - awt::Rectangle aRet; - - const Point aOutPos; - Size aOutSize(m_pControl->GetOutputSizePixel()); - - aRet.X = aOutPos.X(); - aRet.Y = aOutPos.Y(); - aRet.Width = aOutSize.Width(); - aRet.Height = aOutSize.Height(); - - return aRet; -} - -sal_Bool AccessibleSmElementsControl::containsPoint(const awt::Point& aPoint) -{ - SolarMutexGuard aGuard; - TestControl(); - Size aSz(m_pControl->GetOutputSizePixel()); - return aPoint.X >= 0 && aPoint.Y >= 0 && aPoint.X < aSz.Width() && aPoint.Y < aSz.Height(); -} - -uno::Reference<XAccessibleRelationSet> AccessibleSmElementsControl::getAccessibleRelationSet() -{ - uno::Reference<XAccessibleRelationSet> xRelSet = new utl::AccessibleRelationSetHelper(); - return xRelSet; // empty relation set -} - -uno::Reference<XAccessibleStateSet> AccessibleSmElementsControl::getAccessibleStateSet() -{ - SolarMutexGuard aGuard; - rtl::Reference<::utl::AccessibleStateSetHelper> pStateSet = new ::utl::AccessibleStateSetHelper; - - if (!m_pControl) - pStateSet->AddState(AccessibleStateType::DEFUNC); - else - { - pStateSet->AddState(AccessibleStateType::ENABLED); - pStateSet->AddState(AccessibleStateType::FOCUSABLE); - if (m_pControl->HasFocus()) - pStateSet->AddState(AccessibleStateType::FOCUSED); - if (m_pControl->IsActive()) - pStateSet->AddState(AccessibleStateType::ACTIVE); - if (m_pControl->IsVisible()) - pStateSet->AddState(AccessibleStateType::SHOWING); - if (m_pControl->IsReallyVisible()) - pStateSet->AddState(AccessibleStateType::VISIBLE); - if (COL_TRANSPARENT != SmElementsControl::GetControlBackground()) - pStateSet->AddState(AccessibleStateType::OPAQUE); - } - - return pStateSet; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/starmath/source/ElementsDockingWindow.cxx b/starmath/source/ElementsDockingWindow.cxx index f534a5345b8e..bdfdf9e6444d 100644 --- a/starmath/source/ElementsDockingWindow.cxx +++ b/starmath/source/ElementsDockingWindow.cxx @@ -27,7 +27,6 @@ #include <view.hxx> #include <visitors.hxx> #include <document.hxx> -#include "uiobject.hxx" #include <strings.hxx> #include <sfx2/dispatch.hxx> @@ -37,24 +36,11 @@ #include <vcl/settings.hxx> #include <vcl/uitest/eventdescription.hxx> #include <vcl/uitest/logger.hxx> +#include <vcl/virdev.hxx> +#include <unordered_map> #include <utility> -SmElement::SmElement(std::unique_ptr<SmNode>&& pNode, const OUString& aText, const OUString& aHelpText) : - mpNode(std::move(pNode)), - maText(aText), - maHelpText(aHelpText) -{} - -SmElement::~SmElement() -{} - -const std::unique_ptr<SmNode>& SmElement::getNode() const { return mpNode; } - -SmElementSeparator::SmElementSeparator() : - SmElement(std::unique_ptr<SmNode>(), OUString(), OUString()) -{} - namespace { // element, element help, element visual, element visual's translatable @@ -440,25 +426,29 @@ const std::vector<TranslateId> s_a5Categories{ }; template <size_t N> -constexpr std::tuple<TranslateId, const SmElementDescr*, size_t> -asTuple(TranslateId id, const SmElementDescr (&category)[N]) +constexpr std::pair<const SmElementDescr*, size_t> asPair(const SmElementDescr (&category)[N]) { - return { id, category, N }; + return { category, N }; } -const std::tuple<TranslateId, const SmElementDescr*, size_t> s_a5CategoryDescriptions[]{ - asTuple(RID_CATEGORY_UNARY_BINARY_OPERATORS, s_a5UnaryBinaryOperatorsList), - asTuple(RID_CATEGORY_RELATIONS, s_a5RelationsList), - asTuple(RID_CATEGORY_SET_OPERATIONS, s_a5SetOperationsList), - asTuple(RID_CATEGORY_FUNCTIONS, s_a5FunctionsList), - asTuple(RID_CATEGORY_OPERATORS, s_a5OperatorsList), - asTuple(RID_CATEGORY_ATTRIBUTES, s_a5AttributesList), - asTuple(RID_CATEGORY_BRACKETS, s_a5BracketsList), - asTuple(RID_CATEGORY_FORMATS, s_a5FormatsList), - asTuple(RID_CATEGORY_OTHERS, s_a5OthersList), - asTuple(RID_CATEGORY_EXAMPLES, s_a5ExamplesList), +struct TranslateId_hash +{ + size_t operator()(const TranslateId& val) const { return std::hash<std::string_view>()(val.mpId); } }; -} + +const std::unordered_map<TranslateId, std::pair<const SmElementDescr*, size_t>, TranslateId_hash> s_a5CategoryDescriptions{ + { RID_CATEGORY_UNARY_BINARY_OPERATORS, asPair(s_a5UnaryBinaryOperatorsList) }, + { RID_CATEGORY_RELATIONS, asPair(s_a5RelationsList) }, + { RID_CATEGORY_SET_OPERATIONS, asPair(s_a5SetOperationsList) }, + { RID_CATEGORY_FUNCTIONS, asPair(s_a5FunctionsList) }, + { RID_CATEGORY_OPERATORS, asPair(s_a5OperatorsList) }, + { RID_CATEGORY_ATTRIBUTES, asPair(s_a5AttributesList) }, + { RID_CATEGORY_BRACKETS, asPair(s_a5BracketsList) }, + { RID_CATEGORY_FORMATS, asPair(s_a5FormatsList) }, + { RID_CATEGORY_OTHERS, asPair(s_a5OthersList) }, + { RID_CATEGORY_EXAMPLES, asPair(s_a5ExamplesList) }, +}; +} // namespace // static const std::vector<TranslateId>& SmElementsControl::categories() @@ -466,20 +456,17 @@ const std::vector<TranslateId>& SmElementsControl::categories() return s_a5Categories; } -SmElementsControl::SmElementsControl(std::unique_ptr<weld::ScrolledWindow> xScrolledWindow) +SmElementsControl::SmElementsControl(std::unique_ptr<weld::IconView> pIconView) : mpDocShell(new SmDocShell(SfxModelFlags::EMBEDDED_OBJECT)) - , m_nCurrentElement(SAL_MAX_UINT16) - , m_nCurrentRolloverElement(SAL_MAX_UINT16) - , m_nCurrentOffset(0) , m_nSmSyntaxVersion(SM_MOD()->GetConfig()->GetDefaultSmSyntaxVersion()) , mbVerticalMode(true) - , mxScroll(std::move(xScrolledWindow)) - , m_bFirstPaintAfterLayout(false) + , mpIconView(std::move(pIconView)) { - mxScroll->connect_hadjustment_changed( LINK(this, SmElementsControl, ScrollHdl) ); - mxScroll->connect_vadjustment_changed( LINK(this, SmElementsControl, ScrollHdl) ); maParser.reset(starmathdatabase::GetVersionSmParser(m_nSmSyntaxVersion)); maParser->SetImportSymbolNames(true); + + mpIconView->connect_query_tooltip(LINK(this, SmElementsControl, QueryTooltipHandler)); + mpIconView->connect_item_activated(LINK(this, SmElementsControl, ElementActivatedHandler)); } SmElementsControl::~SmElementsControl() @@ -492,33 +479,7 @@ void SmElementsControl::setVerticalMode(bool bVerticalMode) if (mbVerticalMode == bVerticalMode) return; mbVerticalMode = bVerticalMode; - // turn off scrollbars, LayoutOrPaintContents will enable whichever one - // might be needed - mxScroll->set_vpolicy(VclPolicyType::NEVER); - mxScroll->set_hpolicy(VclPolicyType::NEVER); - LayoutOrPaintContents(GetDrawingArea()->get_ref_device(), false); - Invalidate(); -} - -SmElement* SmElementsControl::current() const -{ - sal_uInt16 nCur = (m_nCurrentRolloverElement != SAL_MAX_UINT16) - ? m_nCurrentRolloverElement - : (HasFocus() ? m_nCurrentElement : SAL_MAX_UINT16); - return (nCur < maElementList.size()) ? maElementList[nCur].get() : nullptr; -} - -void SmElementsControl::setCurrentElement(sal_uInt16 nPos) -{ - if (m_nCurrentElement == nPos) - return; - if (nPos != SAL_MAX_UINT16 && nPos >= maElementList.size()) - return; - if (m_xAccessible.is() && m_nCurrentElement != SAL_MAX_UINT16) - m_xAccessible->ReleaseFocus(m_nCurrentElement); - m_nCurrentElement = nPos; - if (m_xAccessible.is() && m_nCurrentElement != SAL_MAX_UINT16) - m_xAccessible->AcquireFocus(); + build(); } Color SmElementsControl::GetTextColor() @@ -533,701 +494,106 @@ Color SmElementsControl::GetControlBackground() return rStyleSettings.GetFieldColor(); } -/** - * !bDraw => layout only - * - * Layouting is always done without a scrollbar and will show or hide it. - * The first paint (m_bFirstPaintAfterLayout) therefore needs to update a - * visible scrollbar, because the layouting was wrong. - **/ -void SmElementsControl::LayoutOrPaintContents(vcl::RenderContext& rContext, bool bDraw) +struct ElementData { - rContext.Push(); - - rContext.SetMapMode( MapMode(MapUnit::Map100thMM) ); - rContext.SetDrawMode( DrawModeFlags::Default ); - rContext.SetLayoutMode( vcl::text::ComplexTextLayoutFlags::Default ); - rContext.SetDigitLanguage( LANGUAGE_ENGLISH ); - if (bDraw) - { - rContext.SetBackground(GetControlBackground()); - rContext.SetTextColor(GetTextColor()); - rContext.Erase(); - } - - const sal_Int32 nControlHeight = GetOutputSizePixel().Height(); - const sal_Int32 nControlWidth = GetOutputSizePixel().Width(); - - sal_Int32 boxX = maMaxElementDimensions.Width() + 10; - sal_Int32 boxY = maMaxElementDimensions.Height() + 10; - - sal_Int32 x = mbVerticalMode ? -mxScroll->hadjustment_get_value() : 0; - sal_Int32 y = !mbVerticalMode ? -mxScroll->vadjustment_get_value() : 0; - - sal_Int32 perLine = 0; - - if (mbVerticalMode) - perLine = nControlHeight / boxY; - else - perLine = nControlWidth / boxX; - if (perLine <= 0) - perLine = 1; - - if (mbVerticalMode) - boxY = nControlHeight / perLine; - else - boxX = nControlWidth / perLine; - - const SmElement* pCurrentElement = current(); - for (const std::unique_ptr<SmElement> & i : maElementList) + OUString maElementSource; + OUString maHelpText; + ElementData(const OUString& aElementSource, const OUString& aHelpText) + : maElementSource(aElementSource) + , maHelpText(aHelpText) { - SmElement* element = i.get(); - if (element->isSeparator()) - { - if (mbVerticalMode) - { - x += boxX; - y = 0; - - element->mBoxLocation = Point(x, y); - element->mBoxSize = Size(10, nControlHeight); - - tools::Rectangle aSelectionRectangle(x + 5 - 1, y + 5, - x + 5 + 1, nControlHeight - 5); - - if (bDraw) - rContext.DrawRect(rContext.PixelToLogic(aSelectionRectangle)); - x += 10; - } - else - { - x = 0; - y += boxY; - - element->mBoxLocation = Point(x, y); - element->mBoxSize = Size(nControlWidth, 10); - - tools::Rectangle aSelectionRectangle(x + 5, y + 5 - 1, - nControlWidth - 5, y + 5 + 1); - - if (bDraw) - rContext.DrawRect(rContext.PixelToLogic(aSelectionRectangle)); - y += 10; - } - } - else - { - if (mbVerticalMode) - { - if (y + boxY > nControlHeight) - { - x += boxX; - y = 0; - } - } - else - { - if ( x + boxX > nControlWidth) - { - x = 0; - y += boxY; - } - } - - element->mBoxLocation = Point(x,y); - element->mBoxSize = Size(boxX, boxY); - - if (bDraw) - { - if (pCurrentElement == element) - { - rContext.Push(vcl::PushFlags::FILLCOLOR | vcl::PushFlags::LINECOLOR); - const StyleSettings& rStyleSettings = rContext.GetSettings().GetStyleSettings(); - rContext.SetLineColor(rStyleSettings.GetHighlightColor()); - rContext.SetFillColor(COL_TRANSPARENT); - rContext.DrawRect(rContext.PixelToLogic(tools::Rectangle(x + 1, y + 1, x + boxX - 1, y + boxY - 1))); - rContext.DrawRect(rContext.PixelToLogic(tools::Rectangle(x + 2, y + 2, x + boxX - 2, y + boxY - 2))); - rContext.Pop(); - } - - Size aSizePixel = rContext.LogicToPixel(Size(element->getNode()->GetWidth(), - element->getNode()->GetHeight())); - Point location(x + ((boxX - aSizePixel.Width()) / 2), - y + ((boxY - aSizePixel.Height()) / 2)); - SmDrawingVisitor(rContext, rContext.PixelToLogic(location), element->getNode().get()); - } - - if (mbVerticalMode) - y += boxY; - else - x += boxX; - } } +}; - if (bDraw) - { - if (!m_bFirstPaintAfterLayout) - { - rContext.Pop(); - return; - } - m_bFirstPaintAfterLayout = false; - } - else - m_bFirstPaintAfterLayout = true; - - if (mbVerticalMode) - { - sal_Int32 nTotalControlWidth = x + boxX + mxScroll->hadjustment_get_value(); - if (nTotalControlWidth > GetOutputSizePixel().Width()) - { - mxScroll->hadjustment_set_upper(nTotalControlWidth); - mxScroll->hadjustment_set_page_size(nControlWidth); - mxScroll->hadjustment_set_page_increment(nControlWidth); - mxScroll->hadjustment_set_step_increment(boxX); - mxScroll->set_hpolicy(VclPolicyType::ALWAYS); - } - else - { - mxScroll->hadjustment_set_value(0); - mxScroll->set_hpolicy(VclPolicyType::NEVER); - } - } - else - { - sal_Int32 nTotalControlHeight = y + boxY + mxScroll->vadjustment_get_value(); - if (nTotalControlHeight > GetOutputSizePixel().Height()) - { - mxScroll->vadjustment_set_upper(nTotalControlHeight); - mxScroll->vadjustment_set_page_size(nControlHeight); - mxScroll->vadjustment_set_page_increment(nControlHeight); - mxScroll->vadjustment_set_step_increment(boxY); - mxScroll->set_vpolicy(VclPolicyType::ALWAYS); - } - else - { - mxScroll->vadjustment_set_value(0); - mxScroll->set_vpolicy(VclPolicyType::NEVER); - } - } - rContext.Pop(); -} - -void SmElementsControl::Resize() -{ - CustomWidgetController::Resize(); - LayoutOrPaintContents(GetDrawingArea()->get_ref_device(), false); -} - -void SmElementsControl::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) +void SmElementsControl::addElement(const OUString& aElementVisual, const OUString& aElementSource, const OUString& aHelpText) { - LayoutOrPaintContents(rRenderContext, true); -} + std::unique_ptr<SmNode> pNode = maParser->ParseExpression(aElementVisual); + VclPtr<VirtualDevice> pDevice(mpIconView->create_virtual_device()); + pDevice->SetTextRenderModeForResolutionIndependentLayout(true); + pDevice->SetMapMode(MapMode(MapUnit::Map100thMM)); + pDevice->SetDrawMode(DrawModeFlags::Default); + pDevice->SetLayoutMode(vcl::text::ComplexTextLayoutFlags::Default); + pDevice->SetDigitLanguage(LANGUAGE_ENGLISH); -OUString SmElementsControl::RequestHelp(tools::Rectangle& rRect) -{ - if (!hasRollover()) - return OUString(); + pDevice->SetBackground(GetControlBackground()); + pDevice->SetTextColor(GetTextColor()); - const SmElement* pHelpElement = current(); - if (!pHelpElement) - return OUString(); + pNode->Prepare(maFormat, *mpDocShell, 0); + pNode->SetSize(Fraction(10,8)); + pNode->Arrange(*pDevice, maFormat); - rRect = tools::Rectangle(pHelpElement->mBoxLocation, pHelpElement->mBoxSize); + Size aSize = pDevice->LogicToPixel(Size(pNode->GetWidth(), pNode->GetHeight())); + aSize.extendBy(10, 0); // Add 5 pixels from both sides to accomodate extending parts of italics + pDevice->SetOutputSizePixel(aSize); + SmDrawingVisitor(*pDevice, pDevice->PixelToLogic(Point(5, 0)), pNode.get()); - // get text and display it - return pHelpElement->getHelpText(); + maItemDatas.push_back(std::make_unique<ElementData>(aElementSource, aHelpText)); + const OUString aId(weld::toId(maItemDatas.back().get())); + mpIconView->insert(-1, nullptr, &aId, pDevice, nullptr); + if (mpIconView->get_item_width() < aSize.Width()) + mpIconView->set_item_width(aSize.Width()); } -bool SmElementsControl::MouseMove( const MouseEvent& rMouseEvent ) +OUString SmElementsControl::GetElementSource(const OUString& itemId) { - if (rMouseEvent.IsLeaveWindow()) - { - m_nCurrentRolloverElement = SAL_MAX_UINT16; - Invalidate(); - return false; - } - - if (tools::Rectangle(Point(0, 0), GetOutputSizePixel()).Contains(rMouseEvent.GetPosPixel())) - { - const SmElement* pPrevElement = current(); - if (pPrevElement) - { - const tools::Rectangle rect(pPrevElement->mBoxLocation, pPrevElement->mBoxSize); - if (rect.Contains(rMouseEvent.GetPosPixel())) - return true; - } - - const sal_uInt16 nElementCount = maElementList.size(); - for (sal_uInt16 n = 0; n < nElementCount; n++) - { - const SmElement* element = maElementList[n].get(); - if (pPrevElement == element) - continue; - - const tools::Rectangle rect(element->mBoxLocation, element->mBoxSize); - if (rect.Contains(rMouseEvent.GetPosPixel())) - { - m_nCurrentRolloverElement = n; - Invalidate(); - return true; - } - } - if (pPrevElement && hasRollover()) - Invalidate(); - m_nCurrentRolloverElement = SAL_MAX_UINT16; - return true; - } - - return false; + return weld::fromId<ElementData*>(itemId)->maElementSource; } -namespace { - -void collectUIInformation(const OUString& aID) +OUString SmElementsControl::GetElementHelpText(const OUString& itemId) { - EventDescription aDescription; - aDescription.aID = aID; - aDescription.aParent = "element_selector"; - aDescription.aAction = "SELECT"; - aDescription.aKeyWord = "ElementUIObject"; - UITestLogger::getInstance().logEvent(aDescription); -} - + return weld::fromId<ElementData*>(itemId)->maHelpText; } -bool SmElementsControl::MouseButtonDown(const MouseEvent& rMouseEvent) -{ - GrabFocus(); - - if (rMouseEvent.IsLeft() && tools::Rectangle(Point(0, 0), GetOutputSizePixel()).Contains(rMouseEvent.GetPosPixel()) && maSelectHdlLink.IsSet()) - { - const SmElement* pPrevElement = hasRollover() ? current() : nullptr; - if (pPrevElement) - { - tools::Rectangle rect(pPrevElement->mBoxLocation, pPrevElement->mBoxSize); - if (rect.Contains(rMouseEvent.GetPosPixel())) - { - setCurrentElement(m_nCurrentRolloverElement); - maSelectHdlLink.Call(*const_cast<SmElement*>(pPrevElement)); - collectUIInformation(OUString::number(m_nCurrentRolloverElement)); - return true; - } - } - - const sal_uInt16 nElementCount = maElementList.size(); - for (sal_uInt16 n = 0; n < nElementCount; n++) - { - SmElement* element = maElementList[n].get(); - tools::Rectangle rect(element->mBoxLocation, element->mBoxSize); - if (rect.Contains(rMouseEvent.GetPosPixel())) - { - setCurrentElement(n); - maSelectHdlLink.Call(*element); - collectUIInformation(OUString::number(n)); - return true; - } - } - - return true; - } - return false; -} - -void SmElementsControl::GetFocus() +void SmElementsControl::setElementSetId(TranslateId pSetId) { - CustomWidgetController::GetFocus(); - Invalidate(); - if (m_xAccessible.is() && m_nCurrentElement != SAL_MAX_UINT16) - m_xAccessible->AcquireFocus(); + if (msCurrentSetId == pSetId) + return; + msCurrentSetId = pSetId; + build(); } -void SmElementsControl::LoseFocus() +void SmElementsControl::addElements(const TranslateId& rCategory) { - if (m_xAccessible.is() && m_nCurrentElement != SAL_MAX_UINT16) - m_xAccessible->ReleaseFocus(m_nCurrentElement); - CustomWidgetController::LoseFocus(); - Invalidate(); -} + mpIconView->freeze(); + mpIconView->clear(); + mpIconView->set_item_width(0); + maItemDatas.clear(); -sal_uInt16 SmElementsControl::nextElement(const bool bBackward, const sal_uInt16 nStartPos, const sal_uInt16 nLastElement) -{ - sal_uInt16 nPos = nStartPos; + const auto& [aElementsArray, aElementsArraySize] = s_a5CategoryDescriptions.at(rCategory); - while (true) + for (size_t i = 0; i < aElementsArraySize; i++) { - if (bBackward) + const auto& [element, elementHelp, elementVisual, visualTranslatable] = aElementsArray[i]; + if (element.empty()) { - if (nPos == 0) - break; - nPos--; + mpIconView->append_separator({}); } else { - if (nPos == nLastElement) - break; - nPos++; + OUString aElement(OUString::createFromAscii(element)); + OUString aVisual(elementVisual.empty() ? aElement : OUString(elementVisual)); + if (visualTranslatable) + aVisual = aVisual.replaceFirst("$1", SmResId(visualTranslatable)); + OUString aHelp(elementHelp ? SmResId(elementHelp) : OUString()); + addElement(aVisual, aElement, aHelp); } - - if (nStartPos == nPos) - break; - if (!maElementList[nPos]->isSeparator()) - break; } - return nPos; -} - -void SmElementsControl::scrollToElement(const bool bBackward, const SmElement *pCur) -{ - if (mbVerticalMode) - { - auto nScrollPos = mxScroll->hadjustment_get_value(); - nScrollPos += pCur->mBoxLocation.X(); - if (!bBackward) - nScrollPos += pCur->mBoxSize.Width() - GetOutputSizePixel().Width(); - mxScroll->hadjustment_set_value(nScrollPos); - } - else - { - auto nScrollPos = mxScroll->vadjustment_get_value(); - nScrollPos += pCur->mBoxLocation.Y(); - if (!bBackward) - nScrollPos += pCur->mBoxSize.Height() - GetOutputSizePixel().Height(); - mxScroll->vadjustment_set_value(nScrollPos); - } -} - -void SmElementsControl::stepFocus(const bool bBackward) -{ - const sal_uInt16 nStartPos = m_nCurrentElement; - const sal_uInt16 nLastElement = (maElementList.size() ? maElementList.size() - 1 : 0); - assert(nStartPos <= nLastElement); - - sal_uInt16 nPos = nextElement(bBackward, nStartPos, nLastElement); - if (nStartPos != nPos) - { - m_nCurrentRolloverElement = SAL_MAX_UINT16; - setCurrentElement(nPos); - - const tools::Rectangle outputRect(Point(0,0), GetOutputSizePixel()); - const SmElement *pCur = maElementList[nPos].get(); - tools::Rectangle elementRect(pCur->mBoxLocation, pCur->mBoxSize); - if (!outputRect.Contains(elementRect)) - scrollToElement(bBackward, pCur); - Invalidate(); - } -} - -void SmElementsControl::pageFocus(const bool bBackward) -{ - const sal_uInt16 nStartPos = m_nCurrentElement; - const sal_uInt16 nLastElement = (maElementList.size() ? maElementList.size() - 1 : 0); - assert(nStartPos <= nLastElement); - tools::Rectangle outputRect(Point(0,0), GetOutputSizePixel()); - sal_uInt16 nPrevPos = nStartPos; - sal_uInt16 nPos = nPrevPos; - - bool bMoved = false; - while (true) - { - nPrevPos = nPos; - nPos = nextElement(bBackward, nPrevPos, nLastElement); - if (nPrevPos == nPos) - break; - - m_nCurrentRolloverElement = SAL_MAX_UINT16; - - SmElement *pCur = maElementList[nPos].get(); - tools::Rectangle elementRect(pCur->mBoxLocation, pCur->mBoxSize); - if (!outputRect.Contains(elementRect)) - { - if (nPrevPos != nStartPos) - { - nPos = nPrevPos; - break; - } - if (bMoved) - break; - pCur = maElementList[nPrevPos].get(); - - elementRect = tools::Rectangle(pCur->mBoxLocation, pCur->mBoxSize); - if (mbVerticalMode) - outputRect.Move(bBackward ? -outputRect.GetWidth() + elementRect.Right() : elementRect.Left(), 0); - else - outputRect.Move(0, bBackward ? -outputRect.GetHeight() + elementRect.Bottom() : elementRect.Top()); - bMoved = true; - } - } - - if (nStartPos != nPos) - { - setCurrentElement(nPos); - if (bMoved) - scrollToElement(bBackward, maElementList[nPos].get()); - Invalidate(); - } -} - -bool SmElementsControl::KeyInput(const KeyEvent& rKEvt) -{ - vcl::KeyCode aKeyCode = rKEvt.GetKeyCode(); - - if (aKeyCode.GetModifier()) - { - return false; - } - - switch(aKeyCode.GetCode()) - { - case KEY_RETURN: - [[fallthrough]]; - case KEY_SPACE: - assert(m_nCurrentElement < maElementList.size()); - assert(maSelectHdlLink.IsSet()); - maSelectHdlLink.Call(*maElementList[m_nCurrentElement]); - collectUIInformation(OUString::number(m_nCurrentElement)); - break; - - case KEY_DOWN: - [[fallthrough]]; - case KEY_RIGHT: - stepFocus(false); - break; - - case KEY_LEFT: - [[fallthrough]]; - case KEY_UP: - stepFocus(true); - break; - - case KEY_HOME: - if (!maElementList.empty()) - { - setCurrentElement(0); - mxScroll->vadjustment_set_value(0); - } - break; - case KEY_END: - if (!maElementList.empty()) - { - setCurrentElement(maElementList.size() - 1); - mxScroll->vadjustment_set_value(mxScroll->vadjustment_get_upper()); - } - break; - - case KEY_PAGEUP: - pageFocus(true); - break; - case KEY_PAGEDOWN: - pageFocus(false); - break; - - default: - return false; - } - return true; -} - -IMPL_LINK_NOARG( SmElementsControl, ScrollHdl, weld::ScrolledWindow&, void ) -{ - Invalidate(); -} - -void SmElementsControl::addElement(const OUString& aElementVisual, const OUString& aElementSource, const OUString& aHelpText) -{ - // SAL_MAX_UINT16 is invalid, zero is the scrollbar - assert(maElementList.size() < SAL_MAX_UINT16 - 2); - auto pNode = maParser->ParseExpression(aElementVisual); - - OutputDevice& rDevice = GetDrawingArea()->get_ref_device(); - rDevice.Push(vcl::PushFlags::MAPMODE); - rDevice.SetMapMode( MapMode(MapUnit::Map100thMM) ); - - pNode->Prepare(maFormat, *mpDocShell, 0); - pNode->SetSize(Fraction(10,8)); - pNode->Arrange(rDevice, maFormat); - - Size aSizePixel = rDevice.LogicToPixel(Size(pNode->GetWidth(), pNode->GetHeight()), MapMode(MapUnit::Map100thMM)); - if (aSizePixel.Width() > maMaxElementDimensions.Width()) { - maMaxElementDimensions.setWidth( aSizePixel.Width() ); - } - - if (aSizePixel.Height() > maMaxElementDimensions.Height()) { - maMaxElementDimensions.setHeight( aSizePixel.Height() ); - } - - maElementList.push_back(std::make_unique<SmElement>(std::move(pNode), aElementSource, aHelpText)); - - rDevice.Pop(); -} - -void SmElementsControl::setElementSetId(TranslateId pSetId) -{ - if (msCurrentSetId == pSetId) - return; - msCurrentSetId = pSetId; - maMaxElementDimensions = Size(); - build(); + mpIconView->set_size_request(0, 0); + mpIconView->thaw(); } void SmElementsControl::build() { - // The order is important! - // 1. Ensure there are no items left - // 2. Release all the current accessible items. - // This will check for new items after releasing them! - // 3. Set the cursor element - maElementList.clear(); - mxScroll->hadjustment_set_value(0); - mxScroll->vadjustment_set_value(0); - mxScroll->set_hpolicy(VclPolicyType::NEVER); - mxScroll->set_vpolicy(VclPolicyType::NEVER); - - if (m_xAccessible.is()) - m_xAccessible->ReleaseAllItems(); - - setCurrentElement(SAL_MAX_UINT16); - - m_nCurrentOffset = 0; - switch(m_nSmSyntaxVersion) { case 5: - { - for (const auto& [rSetId, rElementsArray, rElementsArraySize] : s_a5CategoryDescriptions) - { - if (msCurrentSetId == rSetId) - { - for (size_t i = 0; i < rElementsArraySize; i++) - { - const auto& [element, elementHelp, elementVisual, visualTranslatable] - = rElementsArray[i]; - if (element.empty()) - { - maElementList.push_back(std::make_unique<SmElementSeparator>()); - } - else - { - OUString aElement(OUString::createFromAscii(element)); - OUString aVisual(elementVisual.empty() ? aElement - : OUString(elementVisual)); - if (visualTranslatable) - aVisual = aVisual.replaceFirst("$1", SmResId(visualTranslatable)); - OUString aHelp(elementHelp ? SmResId(elementHelp) : OUString()); - addElement(aVisual, aElement, aHelp); - } - } - - break; - } - else - m_nCurrentOffset += rElementsArraySize; - } + addElements(msCurrentSetId); break; - } case 6: default: throw std::range_error("parser version limit"); } - - m_nCurrentRolloverElement = SAL_MAX_UINT16; - LayoutOrPaintContents(GetDrawingArea()->get_ref_device(), false); - - if (m_xAccessible.is()) - m_xAccessible->AddAllItems(); - - setCurrentElement(0); - Invalidate(); -} - -void SmElementsControl::SetDrawingArea(weld::DrawingArea* pDrawingArea) -{ - CustomWidgetController::SetDrawingArea(pDrawingArea); - OutputDevice& rDevice = pDrawingArea->get_ref_device(); - maFormat.SetBaseSize(rDevice.PixelToLogic(Size(0, SmPtsTo100th_mm(12)))); - Size aSize(rDevice.LogicToPixel(Size(10, 100), MapMode(MapUnit::MapAppFont))); - // give it an arbitrary small width request so it can shrink in the sidebar - pDrawingArea->set_size_request(42, aSize.Height()); - SetOutputSizePixel(aSize); -} - -FactoryFunction SmElementsControl::GetUITestFactory() const -{ - return ElementSelectorUIObject::create; -} - -bool SmElementsControl::itemIsSeparator(sal_uInt16 nPos) const -{ - if (nPos < m_nCurrentOffset) - return true; - nPos -= m_nCurrentOffset; - if (nPos >= maElementList.size()) - return true; - return maElementList[nPos]->isSeparator(); -} - -css::uno::Reference<css::accessibility::XAccessible> SmElementsControl::CreateAccessible() -{ - if (!m_xAccessible.is()) - { - m_xAccessible = new AccessibleSmElementsControl(*this); - m_xAccessible->AddAllItems(); - } - return m_xAccessible; -} - -bool SmElementsControl::itemTrigger(sal_uInt16 nPos) -{ - if (nPos < m_nCurrentOffset) - return false; - nPos -= m_nCurrentOffset; - if (nPos >= maElementList.size()) - return false; - - maSelectHdlLink.Call(*maElementList[nPos]); - collectUIInformation(OUString::number(nPos)); - return true; -} - -tools::Rectangle SmElementsControl::itemPosRect(sal_uInt16 nPos) const -{ - if (nPos < m_nCurrentOffset) - return tools::Rectangle(); - nPos -= m_nCurrentOffset; - if (nPos >= maElementList.size()) - return tools::Rectangle(); - - SmElement* pItem = maElementList[nPos].get(); - return tools::Rectangle(pItem->mBoxLocation, pItem->mBoxSize); -} - -bool SmElementsControl::itemIsVisible(sal_uInt16 nPos) const -{ - tools::Rectangle elementRect = itemPosRect(nPos); - if (elementRect.IsEmpty()) - return false; - - tools::Rectangle outputRect(Point(0, 0), GetOutputSizePixel()); - return outputRect.Contains(elementRect); -} - -sal_uInt16 SmElementsControl::itemCount() const { return maElementList.size(); } - -sal_uInt16 SmElementsControl::itemHighlighted() const { return m_nCurrentElement; } - -void SmElementsControl::setItemHighlighted(sal_uInt16 nPos) -{ - if (m_nCurrentRolloverElement == nPos) - return; - if (nPos != SAL_MAX_UINT16 && nPos >= maElementList.size()) - return; - - if (maElementList[nPos]->isSeparator()) - m_nCurrentRolloverElement = SAL_MAX_UINT16; - else - m_nCurrentRolloverElement = nPos; - Invalidate(); } void SmElementsControl::setSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion) @@ -1242,35 +608,26 @@ void SmElementsControl::setSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion) } } -OUString SmElementsControl::itemName(sal_uInt16 nPos) const +IMPL_LINK(SmElementsControl, QueryTooltipHandler, const weld::TreeIter&, iter, OUString) { - if (nPos < m_nCurrentOffset) - return OUString(); - nPos -= m_nCurrentOffset; - if (nPos >= maElementList.size()) - return OUString(); - - return maElementList[nPos]->getHelpText(); + if (const OUString id = mpIconView->get_id(iter); !id.isEmpty()) + return GetElementHelpText(id); + return {}; } -sal_uInt16 SmElementsControl::itemAtPos(const Point& rPoint) const +IMPL_LINK_NOARG(SmElementsControl, ElementActivatedHandler, weld::IconView&, bool) { - sal_uInt16 nElementCount = maElementList.size(); - for (sal_uInt16 n = 0; n < nElementCount; n++) - { - const SmElement* pItem = maElementList[n].get(); - tools::Rectangle elementRect(pItem->mBoxLocation, pItem->mBoxSize); - if (elementRect.Contains(rPoint)) - return n; - } - return SAL_MAX_UINT16; + if (const OUString id = mpIconView->get_selected_id(); !id.isEmpty()) + maSelectHdlLink.Call(GetElementSource(id)); + + mpIconView->unselect_all(); + return true; } SmElementsDockingWindow::SmElementsDockingWindow(SfxBindings* pInputBindings, SfxChildWindow* pChildWindow, vcl::Window* pParent) : SfxDockingWindow(pInputBindings, pChildWindow, pParent, "DockingElements", "modules/smath/ui/dockingelements.ui") - , mxElementsControl(new SmElementsControl(m_xBuilder->weld_scrolled_window("scrolledwindow", true))) - , mxElementsControlWin(new weld::CustomWeld(*m_xBuilder, "element_selector", *mxElementsControl)) + , mxElementsControl(std::make_unique<SmElementsControl>(m_xBuilder->weld_icon_view("elements"))) , mxElementListBox(m_xBuilder->weld_combo_box("listbox")) { // give it an arbitrary small width request so it can shrink in the sidebar @@ -1300,7 +657,6 @@ SmElementsDockingWindow::~SmElementsDockingWindow () void SmElementsDockingWindow::dispose() { - mxElementsControlWin.reset(); mxElementsControl.reset(); mxElementListBox.reset(); SfxDockingWindow::dispose(); @@ -1328,16 +684,15 @@ void SmElementsDockingWindow::EndDocking( const tools::Rectangle& rReactangle, b mxElementsControl->setVerticalMode(bVertical); } -IMPL_LINK(SmElementsDockingWindow, SelectClickHandler, SmElement&, rElement, void) +IMPL_LINK(SmElementsDockingWindow, SelectClickHandler, OUString, sElementSource, void) { SmViewShell* pViewSh = GetView(); if (pViewSh) { - std::unique_ptr<SfxStringItem> pInsertCommand = std::make_unique<SfxStringItem>(SID_INSERTCOMMANDTEXT, rElement.getText()); + SfxStringItem aInsertCommand(SID_INSERTCOMMANDTEXT, sElementSource); pViewSh->GetViewFrame()->GetDispatcher()->ExecuteList( - SID_INSERTCOMMANDTEXT, SfxCallMode::RECORD, - { pInsertCommand.get() }); + SID_INSERTCOMMANDTEXT, SfxCallMode::RECORD, { &aInsertCommand }); } } diff --git a/starmath/source/SmElementsPanel.cxx b/starmath/source/SmElementsPanel.cxx index fdf76daa6e1d..165e950ead5a 100644 --- a/starmath/source/SmElementsPanel.cxx +++ b/starmath/source/SmElementsPanel.cxx @@ -41,10 +41,7 @@ SmElementsPanel::SmElementsPanel(weld::Widget& rParent, const SfxBindings& rBind : PanelLayout(&rParent, "MathElementsPanel", "modules/smath/ui/sidebarelements_math.ui") , mrBindings(rBindings) , mxCategoryList(m_xBuilder->weld_tree_view("categorylist")) - , mxElementsControl(std::make_unique<SmElementsControl>( - m_xBuilder->weld_scrolled_window("scrolledwindow", true))) - , mxElementsControlWin( - std::make_unique<weld::CustomWeld>(*m_xBuilder, "element_selector", *mxElementsControl)) + , mxElementsControl(std::make_unique<SmElementsControl>(m_xBuilder->weld_icon_view("elements"))) { for (const auto& rCategoryId : SmElementsControl::categories()) mxCategoryList->append_text(SmResId(rCategoryId)); @@ -54,14 +51,12 @@ SmElementsPanel::SmElementsPanel(weld::Widget& rParent, const SfxBindings& rBind mxCategoryList->connect_changed(LINK(this, SmElementsPanel, CategorySelectedHandle)); mxCategoryList->select_text(SmResId(RID_CATEGORY_UNARY_BINARY_OPERATORS)); - mxElementsControl->setVerticalMode(false); // Sidebar currently can only dock to a side mxElementsControl->setElementSetId(RID_CATEGORY_UNARY_BINARY_OPERATORS); mxElementsControl->SetSelectHdl(LINK(this, SmElementsPanel, ElementClickHandler)); } SmElementsPanel::~SmElementsPanel() { - mxElementsControlWin.reset(); mxElementsControl.reset(); mxCategoryList.reset(); } @@ -82,14 +77,13 @@ IMPL_LINK(SmElementsPanel, CategorySelectedHandle, weld::TreeView&, rList, void) } } -IMPL_LINK(SmElementsPanel, ElementClickHandler, SmElement&, rElement, void) +IMPL_LINK(SmElementsPanel, ElementClickHandler, OUString, ElementSource, void) { if (SmViewShell* pViewSh = GetView()) { - std::unique_ptr<SfxStringItem> pInsertCommand - = std::make_unique<SfxStringItem>(SID_INSERTCOMMANDTEXT, rElement.getText()); + SfxStringItem aInsertCommand(SID_INSERTCOMMANDTEXT, ElementSource); pViewSh->GetViewFrame()->GetDispatcher()->ExecuteList( - SID_INSERTCOMMANDTEXT, SfxCallMode::RECORD, { pInsertCommand.get() }); + SID_INSERTCOMMANDTEXT, SfxCallMode::RECORD, { &aInsertCommand }); } } diff --git a/starmath/source/SmElementsPanel.hxx b/starmath/source/SmElementsPanel.hxx index 72de4c227a87..d80d53e7211f 100644 --- a/starmath/source/SmElementsPanel.hxx +++ b/starmath/source/SmElementsPanel.hxx @@ -41,7 +41,7 @@ public: private: DECL_LINK(CategorySelectedHandle, weld::TreeView&, void); - DECL_LINK(ElementClickHandler, SmElement&, void); + DECL_LINK(ElementClickHandler, OUString, void); SmViewShell* GetView() const; @@ -49,7 +49,6 @@ private: std::unique_ptr<weld::TreeView> mxCategoryList; std::unique_ptr<SmElementsControl> mxElementsControl; - std::unique_ptr<weld::CustomWeld> mxElementsControlWin; }; } // end of namespace sm::sidebar diff --git a/starmath/source/uiobject.cxx b/starmath/source/uiobject.cxx deleted file mode 100644 index e39de3cc6bbe..000000000000 --- a/starmath/source/uiobject.cxx +++ /dev/null @@ -1,106 +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/. - */ - -#include <memory> -#include "uiobject.hxx" -#include <ElementsDockingWindow.hxx> - -ElementUIObject::ElementUIObject(SmElementsControl* pElementSelector, - const OUString& rID): - mpElementsSelector(pElementSelector), - maID(rID) -{ -} - -SmElement* ElementUIObject::get_element() -{ - sal_uInt32 nID = maID.toUInt32(); - size_t n = mpElementsSelector->maElementList.size(); - if (nID >= n) - return nullptr; - - return mpElementsSelector->maElementList[nID].get(); -} - -StringMap ElementUIObject::get_state() -{ - StringMap aMap; - aMap["ID"] = maID; - - SmElement* pElement = get_element(); - if (pElement) - aMap["Text"] = pElement->getText(); - - return aMap; -} - -void ElementUIObject::execute(const OUString& rAction, - const StringMap& /*rParameters*/) -{ - if (rAction == "SELECT") - { - SmElement* pElement = get_element(); - if (pElement) - mpElementsSelector->maSelectHdlLink.Call(*pElement); - } -} - -ElementSelectorUIObject::ElementSelectorUIObject(vcl::Window* pElementSelectorWindow) - : DrawingAreaUIObject(pElementSelectorWindow) - , mpElementsSelector(static_cast<SmElementsControl*>(mpController)) -{ -} - -StringMap ElementSelectorUIObject::get_state() -{ - StringMap aMap = DrawingAreaUIObject::get_state(); - - SmElement* pElement = mpElementsSelector->current(); - if (pElement) - aMap["CurrentEntry"] = pElement->getText(); - - aMap["CurrentSelection"] = OUString::fromUtf8(mpElementsSelector->msCurrentSetId.mpId); - - return aMap; -} - -std::unique_ptr<UIObject> ElementSelectorUIObject::get_child(const OUString& rID) -{ - size_t nID = rID.toInt32(); - size_t n = mpElementsSelector->maElementList.size(); - if (nID >= n) - throw css::uno::RuntimeException("invalid id"); - - return std::unique_ptr<UIObject>(new ElementUIObject(mpElementsSelector, rID)); -} - -std::set<OUString> ElementSelectorUIObject::get_children() const -{ - std::set<OUString> aChildren; - - size_t n = mpElementsSelector->maElementList.size(); - for (size_t i = 0; i < n; ++i) - { - aChildren.insert(OUString::number(i)); - } - - return aChildren; -} - -std::unique_ptr<UIObject> ElementSelectorUIObject::create(vcl::Window* pWindow) -{ - return std::unique_ptr<UIObject>(new ElementSelectorUIObject(pWindow)); -} - -OUString ElementSelectorUIObject::get_name() const -{ - return "SmElementSelector"; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/starmath/source/uiobject.hxx b/starmath/source/uiobject.hxx deleted file mode 100644 index 665572e5ad5e..000000000000 --- a/starmath/source/uiobject.hxx +++ /dev/null @@ -1,57 +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/. - */ - -#pragma once - -#include <vcl/uitest/uiobject.hxx> -#include <ElementsDockingWindow.hxx> - -class ElementUIObject : public UIObject -{ -private: - SmElementsControl* mpElementsSelector; - OUString maID; - -public: - - ElementUIObject(SmElementsControl* pElementSelector, - const OUString& rID); - - virtual StringMap get_state() override; - - virtual void execute(const OUString& rAction, - const StringMap& rParameters) override; - -private: - SmElement* get_element(); -}; - -class ElementSelectorUIObject : public DrawingAreaUIObject -{ -private: - SmElementsControl* mpElementsSelector; - -public: - - explicit ElementSelectorUIObject(vcl::Window* pElementSelectorWindow); - - virtual StringMap get_state() override; - - static std::unique_ptr<UIObject> create(vcl::Window* pWindow); - - virtual std::unique_ptr<UIObject> get_child(const OUString& rID) override; - - virtual std::set<OUString> get_children() const override; - -protected: - - virtual OUString get_name() const override; -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/starmath/uiconfig/smath/ui/dockingelements.ui b/starmath/uiconfig/smath/ui/dockingelements.ui index 18b7356afcbe..a7dfec85ebaf 100644 --- a/starmath/uiconfig/smath/ui/dockingelements.ui +++ b/starmath/uiconfig/smath/ui/dockingelements.ui @@ -2,9 +2,17 @@ <!-- Generated with glade 3.22.1 --> <interface domain="sm"> <requires lib="gtk+" version="3.20"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkBox" id="DockingElements"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="hexpand">True</property> <property name="vexpand">True</property> <property name="orientation">vertical</property> @@ -12,8 +20,8 @@ <child> <object class="GtkComboBoxText" id="listbox"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes" context="dockingelements|ElementCategories|tooltip_text">Element categories</property> + <property name="can-focus">False</property> + <property name="tooltip-text" translatable="yes" context="dockingelements|ElementCategories|tooltip_text">Element categories</property> </object> <packing> <property name="expand">False</property> @@ -22,25 +30,23 @@ </packing> </child> <child> - <object class="GtkScrolledWindow" id="scrolledwindow"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can-focus">True</property> <property name="hexpand">True</property> <property name="vexpand">True</property> - <property name="shadow_type">in</property> + <property name="shadow-type">in</property> <child> - <object class="GtkViewport"> + <object class="GtkIconView" id="elements"> <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkDrawingArea" id="element_selector"> - <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_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK | GDK_SCROLL_MASK | GDK_SMOOTH_SCROLL_MASK</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> - </object> - </child> + <property name="can-focus">True</property> + <property name="margin">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="columns">2</property> + <property name="pixbuf-column">0</property> + <property name="activate-on-single-click">True</property> </object> </child> </object> diff --git a/starmath/uiconfig/smath/ui/sidebarelements_math.ui b/starmath/uiconfig/smath/ui/sidebarelements_math.ui index b8ae84e7cfa9..e82e6032de22 100644 --- a/starmath/uiconfig/smath/ui/sidebarelements_math.ui +++ b/starmath/uiconfig/smath/ui/sidebarelements_math.ui @@ -10,6 +10,14 @@ <column type="gchararray"/> </columns> </object> + <object class="GtkTreeStore" id="liststore2"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkPaned" id="MathElementsPanel"> <property name="visible">True</property> <property name="can-focus">False</property> @@ -53,37 +61,23 @@ </object> </child> <child> - <object class="GtkScrolledWindow" id="scrolledwindow"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> <property name="can-focus">True</property> <property name="hexpand">True</property> <property name="vexpand">True</property> <property name="shadow-type">in</property> <child> - <object class="GtkViewport"> + <object class="GtkIconView" id="elements"> <property name="visible">True</property> - <property name="can-focus">False</property> - <child> - <object class="GtkBox"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="orientation">vertical</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> - <child> - <object class="GtkDrawingArea" id="element_selector"> - <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_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK | GDK_SCROLL_MASK | GDK_SMOOTH_SCROLL_MASK</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - </object> - </child> + <property name="can-focus">True</property> + <property name="margin">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore2</property> + <property name="columns">2</property> + <property name="pixbuf-column">0</property> + <property name="activate-on-single-click">True</property> </object> </child> </object> |