restore ScEditWindow a11y
Change-Id: I425cdf3d868b37a4975f502f3cade4298f3a948a
Reviewed-on: https://gerrit.libreoffice.org/70428
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/sc/source/ui/Accessibility/AccessibleEditObject.cxx b/sc/source/ui/Accessibility/AccessibleEditObject.cxx
index 1b08297..dc32e50 100644
--- a/sc/source/ui/Accessibility/AccessibleEditObject.cxx
+++ b/sc/source/ui/Accessibility/AccessibleEditObject.cxx
@@ -60,13 +60,35 @@ ScAccessibleEditObject::ScAccessibleEditObject(
const uno::Reference<XAccessible>& rxParent,
EditView* pEditView, vcl::Window* pWin, const OUString& rName,
const OUString& rDescription, EditObjectType eObjectType)
:
ScAccessibleContextBase(rxParent, AccessibleRole::TEXT_FRAME),
mpEditView(pEditView),
mpWindow(pWin),
meObjectType(eObjectType),
mbHasFocus(false)
: ScAccessibleContextBase(rxParent, AccessibleRole::TEXT_FRAME)
, mpEditView(pEditView)
, mpWindow(pWin)
, meObjectType(eObjectType)
, mbHasFocus(false)
, m_pScDoc(nullptr)
{
InitAcc(rxParent, pEditView, pWin, rName, rDescription);
}
ScAccessibleEditObject::ScAccessibleEditObject(EditObjectType eObjectType)
: ScAccessibleContextBase(nullptr, AccessibleRole::TEXT_FRAME)
, mpEditView(nullptr)
, mpWindow(nullptr)
, meObjectType(eObjectType)
, mbHasFocus(false)
, m_pScDoc(nullptr)
{
}
void ScAccessibleEditObject::InitAcc(
const uno::Reference<XAccessible>& rxParent,
EditView* pEditView, vcl::Window* pWin, const OUString& rName,
const OUString& rDescription)
{
SetParent(rxParent);
mpEditView = pEditView;
mpWindow = pWin;
CreateTextHelper();
SetName(rName);
SetDescription(rDescription);
@@ -78,13 +100,7 @@ ScAccessibleEditObject::ScAccessibleEditObject(
m_pScDoc = pAccDoc->GetDocument();
m_curCellAddress =pAccDoc->GetCurCellAddress();
}
else
{
m_pScDoc=nullptr;
}
}
else
m_pScDoc=nullptr;
}
ScAccessibleEditObject::~ScAccessibleEditObject()
@@ -331,6 +347,11 @@ bool ScAccessibleEditObject::IsDefunc(
(rxParentStates.is() && rxParentStates->contains(AccessibleStateType::DEFUNC));
}
OutputDevice* ScAccessibleEditObject::GetOutputDeviceForView()
{
return mpWindow;
}
void ScAccessibleEditObject::CreateTextHelper()
{
if (!mpTextHelper)
@@ -339,12 +360,12 @@ void ScAccessibleEditObject::CreateTextHelper()
if (meObjectType == CellInEditMode || meObjectType == EditControl)
{
pAccessibleTextData.reset
(new ScAccessibleEditObjectTextData(mpEditView, mpWindow));
(new ScAccessibleEditObjectTextData(mpEditView, GetOutputDeviceForView()));
}
else
{
pAccessibleTextData.reset
(new ScAccessibleEditLineTextData(nullptr, mpWindow));
(new ScAccessibleEditLineTextData(nullptr, GetOutputDeviceForView()));
}
std::unique_ptr<ScAccessibilityEditSource> pEditSrc =
@@ -512,4 +533,62 @@ uno::Reference< XAccessibleRelationSet > ScAccessibleEditObject::getAccessibleRe
return uno::Reference< XAccessibleRelationSet >();
}
tools::Rectangle ScAccessibleEditControlObject::GetBoundingBoxOnScreen() const
{
tools::Rectangle aScreenBounds;
if (m_pController && m_pController->GetDrawingArea())
{
aScreenBounds = tools::Rectangle(m_pController->GetDrawingArea()->get_accessible_location(),
m_pController->GetOutputSizePixel());
}
return aScreenBounds;
}
tools::Rectangle ScAccessibleEditControlObject::GetBoundingBox() const
{
tools::Rectangle aBounds( GetBoundingBoxOnScreen() );
uno::Reference< XAccessibleContext > xContext(const_cast<ScAccessibleEditControlObject*>(this)->getAccessibleContext());
if ( xContext.is() )
{
uno::Reference< XAccessible > xParent( xContext->getAccessibleParent() );
if ( xParent.is() )
{
uno::Reference< XAccessibleComponent > xParentComponent( xParent->getAccessibleContext(), uno::UNO_QUERY );
if ( xParentComponent.is() )
{
Point aScreenLoc = aBounds.TopLeft();
awt::Point aParentScreenLoc = xParentComponent->getLocationOnScreen();
Point aPos( aScreenLoc.getX() - aParentScreenLoc.X, aScreenLoc.getY() - aParentScreenLoc.Y );
aBounds.SetPos( aPos );
}
}
}
return aBounds;
}
void SAL_CALL ScAccessibleEditControlObject::disposing()
{
ScAccessibleEditObject::disposing();
m_pController = nullptr;
}
uno::Reference< XAccessibleRelationSet > ScAccessibleEditControlObject::getAccessibleRelationSet()
{
SolarMutexGuard aGuard;
if (!m_pController || !m_pController->GetDrawingArea())
return uno::Reference< XAccessibleRelationSet >();
return m_pController->GetDrawingArea()->get_accessible_relation_set();
}
OutputDevice* ScAccessibleEditControlObject::GetOutputDeviceForView()
{
if (!m_pController || !m_pController->GetDrawingArea())
return nullptr;
return &m_pController->GetDrawingArea()->get_ref_device();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/AccessibleContextBase.hxx b/sc/source/ui/inc/AccessibleContextBase.hxx
index 8451169..ec2f5da 100644
--- a/sc/source/ui/inc/AccessibleContextBase.hxx
+++ b/sc/source/ui/inc/AccessibleContextBase.hxx
@@ -247,6 +247,8 @@ public:
/// Use this method to set initial Description without notification
void SetDescription(const OUString& rDesc) { msDescription = rDesc; }
void SetParent(const css::uno::Reference<css::accessibility::XAccessible>& rParent) { mxParent = rParent; }
protected:
/// Calls all FocusListener to tell they that the focus is gained.
void CommitFocusGained() const;
diff --git a/sc/source/ui/inc/AccessibleEditObject.hxx b/sc/source/ui/inc/AccessibleEditObject.hxx
index 9a029e8..ebbd8c6 100644
--- a/sc/source/ui/inc/AccessibleEditObject.hxx
+++ b/sc/source/ui/inc/AccessibleEditObject.hxx
@@ -25,6 +25,7 @@
#include <com/sun/star/accessibility/XAccessibleSelection.hpp>
#include <address.hxx>
#include <vcl/vclptr.hxx>
#include <vcl/customweld.hxx>
#include <memory>
@@ -56,9 +57,16 @@ public:
EditView* pEditView, vcl::Window* pWin, const OUString& rName,
const OUString& rDescription, EditObjectType eObjectType);
void InitAcc(
const css::uno::Reference<css::accessibility::XAccessible>& rxParent,
EditView* pEditView, vcl::Window* pWin, const OUString& rName,
const OUString& rDescription);
protected:
virtual ~ScAccessibleEditObject() override;
ScAccessibleEditObject(EditObjectType eObjectType);
using ScAccessibleContextBase::IsDefunc;
public:
@@ -83,6 +91,8 @@ public:
SAL_CALL getAccessibleAtPoint(
const css::awt::Point& rPoint ) override;
virtual OutputDevice* GetOutputDeviceForView();
protected:
/// Return the object's current bounding box relative to the desktop.
virtual tools::Rectangle GetBoundingBoxOnScreen() const override;
@@ -182,6 +192,34 @@ private:
sal_Int32 GetFgBgColor( const OUString &strPropColor) ;
};
class ScAccessibleEditControlObject : public ScAccessibleEditObject
{
private:
weld::CustomWidgetController* m_pController;
protected:
/// Return the object's current bounding box relative to the desktop.
virtual tools::Rectangle GetBoundingBoxOnScreen() const override;
/// Return the object's current bounding box relative to the parent object.
virtual tools::Rectangle GetBoundingBox() const override;
public:
ScAccessibleEditControlObject(weld::CustomWidgetController* pController)
: ScAccessibleEditObject(ScAccessibleEditObject::EditControl)
, m_pController(pController)
{
}
virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) override;
// for mapping positions/sizes within the TextView to a11y
virtual OutputDevice* GetOutputDeviceForView() override;
using ScAccessibleContextBase::disposing;
virtual void SAL_CALL disposing() override;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/pagedlg/tphfedit.cxx b/sc/source/ui/pagedlg/tphfedit.cxx
index ca845a1..c1554f4 100644
--- a/sc/source/ui/pagedlg/tphfedit.cxx
+++ b/sc/source/ui/pagedlg/tphfedit.cxx
@@ -112,7 +112,24 @@ void ScEditWindow::SetDrawingArea(weld::DrawingArea* pDrawingArea)
pDrawingArea->set_text_cursor();
if (pAcc)
pAcc->SetDescription(pDrawingArea->get_tooltip_text());
{
OUString sName;
switch (eLocation)
{
case Left:
sName = ScResId(STR_ACC_LEFTAREA_NAME);
break;
case Center:
sName = ScResId(STR_ACC_CENTERAREA_NAME);
break;
case Right:
sName = ScResId(STR_ACC_RIGHTAREA_NAME);
break;
}
pAcc->InitAcc(nullptr, pEdView.get(), nullptr,
sName, pDrawingArea->get_tooltip_text());
}
}
void ScEditWindow::Resize()
@@ -330,32 +347,9 @@ void ScEditWindow::LoseFocus()
css::uno::Reference< css::accessibility::XAccessible > ScEditWindow::CreateAccessible()
{
OUString sName;
switch (eLocation)
{
case Left:
{
sName = ScResId(STR_ACC_LEFTAREA_NAME);
}
break;
case Center:
{
sName = ScResId(STR_ACC_CENTERAREA_NAME);
}
break;
case Right:
{
sName = ScResId(STR_ACC_RIGHTAREA_NAME);
}
break;
}
#if 0
//TODO
pAcc = new ScAccessibleEditObject(GetAccessibleParentWindow()->GetAccessible(), pEdView.get(), this,
sName, OUString(), ScAccessibleEditObject::EditControl);
pAcc = new ScAccessibleEditControlObject(this);
css::uno::Reference< css::accessibility::XAccessible > xAccessible = pAcc;
xAcc = xAccessible;
#endif
return pAcc;
}