summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sfx2/viewsh.hxx2
-rw-r--r--sc/source/ui/view/tabvwshc.cxx3
-rw-r--r--sd/source/ui/inc/ViewShellBase.hxx2
-rw-r--r--sd/source/ui/view/ViewShellBase.cxx5
-rw-r--r--sfx2/source/view/viewsh.cxx58
-rw-r--r--sw/source/uibase/uiview/view.cxx4
6 files changed, 61 insertions, 13 deletions
diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index 4adf62a196c4..c0628a0bd4fb 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -440,6 +440,8 @@ public:
const LanguageTag& GetLOKLanguageTag() const { return maLOKLanguageTag; }
/// Enable/Disable LibreOfficeKit AT support for this view.
void SetLOKAccessibilityState(bool bEnabled);
+ /// Get LibreOfficeKit AT support state for this view.
+ bool GetLOKAccessibilityState() const { return mbLOKAccessibilityEnabled; }
/// Get the LibreOfficeKit timezone of this view. See @SetLOKTimezone.
std::pair<bool, OUString> GetLOKTimezone() const
diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx
index 997e710e18e9..56cfba5ddfdb 100644
--- a/sc/source/ui/view/tabvwshc.cxx
+++ b/sc/source/ui/view/tabvwshc.cxx
@@ -453,6 +453,9 @@ int ScTabViewShell::getPart() const
void ScTabViewShell::afterCallbackRegistered()
{
+ // common tasks
+ SfxViewShell::afterCallbackRegistered();
+
UpdateInputHandler(true, false);
ScInputHandler* pHdl = mpInputHandler ? mpInputHandler.get() : SC_MOD()->GetInputHdl();
diff --git a/sd/source/ui/inc/ViewShellBase.hxx b/sd/source/ui/inc/ViewShellBase.hxx
index 3f40123405f3..c2b2d16158e0 100644
--- a/sd/source/ui/inc/ViewShellBase.hxx
+++ b/sd/source/ui/inc/ViewShellBase.hxx
@@ -217,8 +217,6 @@ public:
int getEditMode() const override;
/// See SfxViewShell::setEditMode().
void setEditMode(int nMode);
- /// See SfxViewShell::afterCallbackRegistered().
- void afterCallbackRegistered() override;
/// See SfxViewShell::NotifyCursor().
void NotifyCursor(SfxViewShell* pViewShell) const override;
/// See SfxViewShell::GetColorConfigColor().
diff --git a/sd/source/ui/view/ViewShellBase.cxx b/sd/source/ui/view/ViewShellBase.cxx
index 460e102e7796..6ad6d454be57 100644
--- a/sd/source/ui/view/ViewShellBase.cxx
+++ b/sd/source/ui/view/ViewShellBase.cxx
@@ -1010,11 +1010,6 @@ void ViewShellBase::setEditMode(int nMode)
}
}
-void ViewShellBase::afterCallbackRegistered()
-{
- // TODO: Add theme color palette changed callback
-}
-
void ViewShellBase::NotifyCursor(SfxViewShell* pOtherShell) const
{
ViewShell* pThisShell = framework::FrameworkHelper::Instance(*const_cast<ViewShellBase*>(this))->GetViewShell(FrameworkHelper::msCenterPaneURL).get();
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index 0d61e2f3f005..f204b03c3721 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -554,8 +554,10 @@ public:
int getCaretPosition() const;
private:
- void updateParagraphInfo(const uno::Reference<css::accessibility::XAccessibleText>& xAccText,
+ bool updateParagraphInfo(const uno::Reference<css::accessibility::XAccessibleText>& xAccText,
bool force, std::string msg = "");
+ void updateAndNotifyParagraph(const uno::Reference<css::accessibility::XAccessibleText>& xAccText,
+ bool force, std::string msg = "");
};
LOKDocumentFocusListener::LOKDocumentFocusListener(const SfxViewShell* pViewShell)
@@ -676,12 +678,13 @@ void LOKDocumentFocusListener::disposing( const lang::EventObject& aEvent )
}
-void LOKDocumentFocusListener::updateParagraphInfo(const uno::Reference<css::accessibility::XAccessibleText>& xAccText,
+bool LOKDocumentFocusListener::updateParagraphInfo(const uno::Reference<css::accessibility::XAccessibleText>& xAccText,
bool force, std::string msg)
{
if (!xAccText.is())
- return;
+ return false;
+ bool bNotify = false;
// If caret is present inside the paragraph (pos != -1), it means that paragraph has focus in the current view.
sal_Int32 nCaretPosition = xAccText->getCaretPosition();
if (nCaretPosition >= 0)
@@ -695,7 +698,7 @@ void LOKDocumentFocusListener::updateParagraphInfo(const uno::Reference<css::acc
if (m_sFocusedParagraph != sText)
{
m_sFocusedParagraph = sText;
- notifyFocusedParagraphChanged(force);
+ bNotify = true;
}
}
else
@@ -708,9 +711,19 @@ void LOKDocumentFocusListener::updateParagraphInfo(const uno::Reference<css::acc
if (msg.size())
header += ": " + msg;
aboutParagraph(header, xAccText, force);
+ return bNotify;
+
+}
+void LOKDocumentFocusListener::updateAndNotifyParagraph(
+ const uno::Reference<css::accessibility::XAccessibleText>& xAccText,
+ bool force, std::string msg)
+{
+ if (updateParagraphInfo(xAccText, force, msg))
+ notifyFocusedParagraphChanged(force);
}
+
void LOKDocumentFocusListener::notifyEvent(const accessibility::AccessibleEventObject& aEvent )
{
aboutView("LOKDocumentFocusListener::notifyEvent", this, m_pViewShell);
@@ -742,7 +755,7 @@ void LOKDocumentFocusListener::notifyEvent(const accessibility::AccessibleEventO
}
}
uno::Reference<css::accessibility::XAccessibleText> xAccText(xAccessibleObject, uno::UNO_QUERY);
- updateParagraphInfo(xAccText, false, "STATE_CHANGED: FOCUSED");
+ updateAndNotifyParagraph(xAccText, false, "STATE_CHANGED: FOCUSED");
aboutTextFormatting("LOKDocumentFocusListener::notifyEvent: STATE_CHANGED: FOCUSED", xAccText);
}
break;
@@ -810,7 +823,7 @@ void LOKDocumentFocusListener::notifyEvent(const accessibility::AccessibleEventO
// paragraph content updating on the client, even if current editing involves composing.
// We make a guess that if the paragraph accessibility node is not focused,
// it means that the text change has been performed in another view.
- updateParagraphInfo(xAccText, !isFocused(aEvent), "TEXT_CHANGED");
+ updateAndNotifyParagraph(xAccText, !isFocused(aEvent), "TEXT_CHANGED");
break;
}
@@ -1013,6 +1026,34 @@ void LOKDocumentFocusListener::attachRecursive(
attachRecursive(xChild);
}
}
+ else
+ {
+ // Usually, when the document is loaded, a CARET_CHANGED accessibility event is automatically emitted
+ // for the first paragraph. That allows to notify the paragraph content to the client, even if no input
+ // event occurred yet. However, in Cypress tests no accessibility event is automatically emitted until
+ // some input event occurs. So we use the following workaround to notify the content of the focused
+ // paragraph, without waiting for an input event.
+ // Here we update the paragraph info related to the focused paragraph,
+ // later when afterCallbackRegistered is executed we notify the paragraph content.
+ sal_Int64 nChildCount = xContext->getAccessibleChildCount();
+ if (nChildCount > 0)
+ {
+ uno::Reference< accessibility::XAccessible > xChild( xContext->getAccessibleChild( 0 ) );
+ if( xChild.is() )
+ {
+ uno::Reference<css::accessibility::XAccessibleText> xAccText(xChild, uno::UNO_QUERY);
+ if (xAccText.is())
+ {
+ sal_Int32 nPos = xAccText->getCaretPosition();
+ if (nPos >= 0)
+ {
+ attachRecursive(xChild);
+ updateParagraphInfo(xAccText, false, "LOKDocumentFocusListener::attachRecursive(3)");
+ }
+ }
+ }
+ }
+ }
}
}
@@ -2479,6 +2520,11 @@ void SfxViewShell::libreOfficeKitViewAddPendingInvalidateTiles()
void SfxViewShell::afterCallbackRegistered()
{
+ if (GetLOKAccessibilityState())
+ {
+ LOKDocumentFocusListener& rDocFocusListener = GetLOKDocumentFocusListener();
+ rDocFocusListener.notifyFocusedParagraphChanged();
+ }
}
void SfxViewShell::flushPendingLOKInvalidateTiles()
diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx
index d1f18b7b08b9..0e998a57fa71 100644
--- a/sw/source/uibase/uiview/view.cxx
+++ b/sw/source/uibase/uiview/view.cxx
@@ -1182,6 +1182,10 @@ void SwView::afterCallbackRegistered()
{
if (!comphelper::LibreOfficeKit::isActive())
return;
+
+ // common tasks
+ SfxViewShell::afterCallbackRegistered();
+
auto* pDocShell = GetDocShell();
if (pDocShell)
{