From 1e34eadc148f60c039de1393345c49d94bf35417 Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Wed, 25 Dec 2019 13:27:32 +0100 Subject: acc. check: implement goto for OLE/Graphic objects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This implements goto function for Graphic/OLE objects that are reported in a AccessibilityIssue. So this enables to go to the object inside a document for which we have reported an accessibility issue. Change-Id: I699966b116a76ea032cb1acc9a431687fa204e07 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/85922 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl --- include/svx/AccessibilityIssue.hxx | 4 ++ svx/source/dialog/AccessibilityCheckDialog.cxx | 1 + sw/Library_sw.mk | 1 + sw/source/core/access/AccessibilityCheck.cxx | 22 ++++++++-- sw/source/core/access/AccessibilityIssue.cxx | 58 ++++++++++++++++++++++++++ sw/source/core/inc/AccessibilityIssue.hxx | 26 +++++++++--- 6 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 sw/source/core/access/AccessibilityIssue.cxx diff --git a/include/svx/AccessibilityIssue.hxx b/include/svx/AccessibilityIssue.hxx index b0508f5801b9..776e47ff7880 100644 --- a/include/svx/AccessibilityIssue.hxx +++ b/include/svx/AccessibilityIssue.hxx @@ -12,6 +12,9 @@ #define INCLUDED_SVX_ACCESSIBILITYISSUE_HXX #include +#include +#include +#include namespace svx { @@ -31,6 +34,7 @@ public: { } virtual ~AccessibilityIssue() {} + virtual bool canGotoIssue() const = 0; virtual void gotoIssue() const = 0; AccessibilityIssueID m_eIssueID; diff --git a/svx/source/dialog/AccessibilityCheckDialog.cxx b/svx/source/dialog/AccessibilityCheckDialog.cxx index af96c09295d5..5864bd9661bf 100644 --- a/svx/source/dialog/AccessibilityCheckDialog.cxx +++ b/svx/source/dialog/AccessibilityCheckDialog.cxx @@ -23,6 +23,7 @@ AccessibilityCheckEntry::AccessibilityCheckEntry( , m_pAccessibilityIssue(rAccessibilityIssue) { m_xLabel->set_label(m_pAccessibilityIssue->m_aIssueText); + m_xGotoButton->set_visible(m_pAccessibilityIssue->canGotoIssue()); m_xGotoButton->connect_clicked(LINK(this, AccessibilityCheckEntry, GotoButtonClicked)); m_xContainer->show(); } diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk index acab4210994b..ec4c3ebc146e 100644 --- a/sw/Library_sw.mk +++ b/sw/Library_sw.mk @@ -96,6 +96,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\ sw/source/core/SwNumberTree/SwNodeNum \ sw/source/core/SwNumberTree/SwNumberTree \ sw/source/core/access/AccessibilityCheck \ + sw/source/core/access/AccessibilityIssue \ sw/source/core/access/acccell \ sw/source/core/access/acccontext \ sw/source/core/access/accdoc \ diff --git a/sw/source/core/access/AccessibilityCheck.cxx b/sw/source/core/access/AccessibilityCheck.cxx index dc82b4c17e48..606a47da0e6f 100644 --- a/sw/source/core/access/AccessibilityCheck.cxx +++ b/sw/source/core/access/AccessibilityCheck.cxx @@ -46,12 +46,14 @@ OUString sTextBlinking("Blinking text."); OUString sAvoidFootnotes("Avoid footnotes."); OUString sAvoidEndnotes("Avoid endnotes."); -void lclAddIssue(svx::AccessibilityIssueCollection& rIssueCollection, OUString const& rText, - svx::AccessibilityIssueID eIssue = svx::AccessibilityIssueID::UNSPECIFIED) +std::shared_ptr +lclAddIssue(svx::AccessibilityIssueCollection& rIssueCollection, OUString const& rText, + svx::AccessibilityIssueID eIssue = svx::AccessibilityIssueID::UNSPECIFIED) { auto pIssue = std::make_shared(eIssue); pIssue->m_aIssueText = rText; rIssueCollection.getIssues().push_back(pIssue); + return pIssue; } class BaseCheck @@ -92,7 +94,21 @@ class NoTextNodeAltTextCheck : public NodeCheck OUString sName = pNoTextNode->GetFlyFormat()->GetName(); OUString sIssueText = sNoAlt.replaceAll("%OBJECT_NAME%", sName); - lclAddIssue(m_rIssueCollection, sIssueText); + + auto pIssue = lclAddIssue(m_rIssueCollection, sIssueText); + + if (pNoTextNode->IsOLENode()) + { + pIssue->setDoc(pNoTextNode->GetDoc()); + pIssue->setIssueObject(IssueObject::OLE); + pIssue->setObjectID(pNoTextNode->GetFlyFormat()->GetName()); + } + else if (pNoTextNode->IsGrfNode()) + { + pIssue->setDoc(pNoTextNode->GetDoc()); + pIssue->setIssueObject(IssueObject::GRAPHIC); + pIssue->setObjectID(pNoTextNode->GetFlyFormat()->GetName()); + } } } diff --git a/sw/source/core/access/AccessibilityIssue.cxx b/sw/source/core/access/AccessibilityIssue.cxx new file mode 100644 index 000000000000..e4ce9f658f57 --- /dev/null +++ b/sw/source/core/access/AccessibilityIssue.cxx @@ -0,0 +1,58 @@ +/* -*- 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 +#include +#include + +namespace sw +{ +AccessibilityIssue::AccessibilityIssue(svx::AccessibilityIssueID eIssueID) + : svx::AccessibilityIssue(eIssueID) + , m_eIssueObject(IssueObject::UNKNOWN) + , m_pDoc(nullptr) +{ +} + +void AccessibilityIssue::setIssueObject(IssueObject eIssueObject) { m_eIssueObject = eIssueObject; } + +void AccessibilityIssue::setDoc(SwDoc* pDoc) { m_pDoc = pDoc; } + +void AccessibilityIssue::setObjectID(OUString const& rID) { m_sObjectID = rID; } + +bool AccessibilityIssue::canGotoIssue() const +{ + if (m_eIssueObject != IssueObject::UNKNOWN) + return true; + return false; +} + +void AccessibilityIssue::gotoIssue() const +{ + if (!m_pDoc) + return; + + switch (m_eIssueObject) + { + case IssueObject::GRAPHIC: + case IssueObject::OLE: + { + SwWrtShell* pWrtShell = m_pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->GotoFly(m_sObjectID, FLYCNTTYPE_ALL, true); + } + break; + default: + break; + } +} + +} // end sw namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/inc/AccessibilityIssue.hxx b/sw/source/core/inc/AccessibilityIssue.hxx index afb5b57d6170..2d8776ac5c1f 100644 --- a/sw/source/core/inc/AccessibilityIssue.hxx +++ b/sw/source/core/inc/AccessibilityIssue.hxx @@ -12,17 +12,33 @@ #define INCLUDED_SW_SOURCE_CORE_ACCESSIBILITYISSUE_HXX #include +#include namespace sw { +enum class IssueObject +{ + UNKNOWN, + GRAPHIC, + OLE, +}; + class SW_DLLPUBLIC AccessibilityIssue final : public svx::AccessibilityIssue { +private: + IssueObject m_eIssueObject; + SwDoc* m_pDoc; + OUString m_sObjectID; + public: - AccessibilityIssue(svx::AccessibilityIssueID eIssueID = svx::AccessibilityIssueID::UNSPECIFIED) - : svx::AccessibilityIssue(eIssueID) - { - } - void gotoIssue() const override {} + AccessibilityIssue(svx::AccessibilityIssueID eIssueID = svx::AccessibilityIssueID::UNSPECIFIED); + + void setIssueObject(IssueObject eIssueObject); + void setDoc(SwDoc* pDoc); + void setObjectID(OUString const& rID); + + bool canGotoIssue() const override; + void gotoIssue() const override; }; } // end sw namespace -- cgit