summaryrefslogtreecommitdiffstats
path: root/sw/source/core/access/accpara.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/access/accpara.hxx')
-rw-r--r--sw/source/core/access/accpara.hxx399
1 files changed, 399 insertions, 0 deletions
diff --git a/sw/source/core/access/accpara.hxx b/sw/source/core/access/accpara.hxx
new file mode 100644
index 000000000..ade2df47d
--- /dev/null
+++ b/sw/source/core/access/accpara.hxx
@@ -0,0 +1,399 @@
+/* -*- 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 .
+ */
+#ifndef INCLUDED_SW_SOURCE_CORE_ACCESS_ACCPARA_HXX
+#define INCLUDED_SW_SOURCE_CORE_ACCESS_ACCPARA_HXX
+
+#include "acccontext.hxx"
+#include <com/sun/star/accessibility/AccessibleScrollType.hpp>
+#include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
+#include <com/sun/star/accessibility/XAccessibleSelection.hpp>
+#include <com/sun/star/accessibility/XAccessibleHypertext.hpp>
+#include <com/sun/star/accessibility/XAccessibleTextMarkup.hpp>
+#include <com/sun/star/accessibility/XAccessibleMultiLineText.hpp>
+#include <com/sun/star/accessibility/XAccessibleTextSelection.hpp>
+#include <com/sun/star/accessibility/XAccessibleExtendedAttributes.hpp>
+#include <com/sun/star/accessibility/XAccessibleTextAttributes.hpp>
+#include "accselectionhelper.hxx"
+#include <unordered_map>
+#include <svl/lstner.hxx>
+
+class SwTextFrame;
+class SwPaM;
+class SwAccessiblePortionData;
+class SwAccessibleHyperTextData;
+class SwRangeRedline;
+class SwXTextPortion;
+class SwParaChangeTrackingInfo; //#i108125#
+
+namespace com::sun::star {
+ namespace i18n { struct Boundary; }
+ namespace accessibility { class XAccessibleHyperlink; }
+ namespace style { struct TabStop; }
+}
+
+typedef std::unordered_map< OUString,
+ css::beans::PropertyValue > tAccParaPropValMap;
+
+class SwAccessibleParagraph :
+ public SfxListener,
+ public SwAccessibleContext,
+ public css::accessibility::XAccessibleEditableText,
+ public css::accessibility::XAccessibleSelection,
+ public css::accessibility::XAccessibleHypertext,
+ public css::accessibility::XAccessibleTextMarkup,
+ public css::accessibility::XAccessibleMultiLineText,
+ public css::accessibility::XAccessibleTextAttributes,
+ public css::accessibility::XAccessibleTextSelection,
+ public css::accessibility::XAccessibleExtendedAttributes
+{
+ friend class SwAccessibleHyperlink;
+
+ OUString m_sDesc; // protected by base classes mutex
+
+ // data for this paragraph's text portions; this contains the
+ // mapping from the core 'model string' to the accessible text
+ // string.
+ // pPortionData may be NULL; it should only be accessed through the
+ // Get/Clear/Has/UpdatePortionData() methods
+ std::unique_ptr<SwAccessiblePortionData> m_pPortionData;
+ std::unique_ptr<SwAccessibleHyperTextData> m_pHyperTextData;
+
+ sal_Int32 m_nOldCaretPos; // The 'old' caret pos. It's only valid as long
+ // as the cursor is inside this object (protected by
+ // mutex)
+
+ bool m_bIsHeading; // protected by base classes mutex
+ sal_Int32 m_nHeadingLevel;
+
+ // implementation for XAccessibleSelection
+ SwAccessibleSelectionHelper m_aSelectionHelper;
+
+ std::unique_ptr<SwParaChangeTrackingInfo> mpParaChangeTrackInfo; // #i108125#
+
+ // XAccessibleComponent
+ bool m_bLastHasSelection;
+
+ /// get the (accessible) text string (requires frame; check before)
+ OUString const & GetString();
+
+ static OUString GetDescription();
+
+ // get the current care position
+ sal_Int32 GetCaretPos();
+
+ // determine the current selection. Fill the values with
+ // -1 if there is no selection in the this paragraph
+ // @param pSelection (optional) check only Nth selection in ring
+ bool GetSelectionAtIndex(sal_Int32 * pSelection, sal_Int32& nStart, sal_Int32& nEnd);
+ bool GetSelection(sal_Int32& nStart, sal_Int32& nEnd) {
+ return GetSelectionAtIndex(nullptr, nStart, nEnd);
+ }
+
+ // helper for GetSelection and getCaretPosition
+ // #i27301# - add parameter <_bForSelection>, which indicates,
+ // if the cursor is retrieved for selection or for caret position.
+ SwPaM* GetCursor( const bool _bForSelection );
+
+ // for cut/copy/paste: execute a particular slot at the view shell
+ void ExecuteAtViewShell( sal_uInt16 nSlot );
+
+ // helper method for get/setAttributes
+ // (for the special case of (nEndIndex==-1) a single character will
+ // be selected)
+ rtl::Reference<SwXTextPortion> CreateUnoPortion( sal_Int32 nStart, sal_Int32 nEnd );
+
+ // methods for checking the parameter range:
+
+ // does nPos point to a char?
+ static bool IsValidChar(sal_Int32 nPos, sal_Int32 nLength);
+
+ // does nPos point to a position? (may be behind the last character)
+ static bool IsValidPosition(sal_Int32 nPos, sal_Int32 nLength);
+
+ // is nBegin...nEnd a valid range? (nEnd points past the last character)
+ static bool IsValidRange(sal_Int32 nBegin, sal_Int32 nEnd, sal_Int32 nLength);
+
+ // Ensure ordered range (i.e. nBegin is smaller then nEnd)
+ static void OrderRange(sal_Int32& nBegin, sal_Int32& nEnd)
+ {
+ if( nBegin > nEnd )
+ {
+ sal_Int32 nTmp = nBegin; nBegin = nEnd; nEnd = nTmp;
+ }
+ }
+
+ const SwRangeRedline* GetRedlineAtIndex();
+ OUString GetFieldTypeNameAtIndex(sal_Int32 nIndex);
+
+ // #i63870#
+ void _getDefaultAttributesImpl(
+ const css::uno::Sequence< OUString >& aRequestedAttributes,
+ tAccParaPropValMap& rDefAttrSeq,
+ const bool bOnlyCharAttrs = false );
+ void _getRunAttributesImpl(
+ const sal_Int32 nIndex,
+ const css::uno::Sequence< OUString >& aRequestedAttributes,
+ tAccParaPropValMap& rRunAttrSeq );
+
+ void _getSupplementalAttributesImpl(
+ const css::uno::Sequence< OUString >& aRequestedAttributes,
+ tAccParaPropValMap& rSupplementalAttrSeq );
+
+ void _correctValues(
+ const sal_Int32 nIndex,
+ std::vector< css::beans::PropertyValue >& rValues );
+
+public:
+ bool IsHeading() const;
+
+protected:
+
+ // Set states for getAccessibleStateSet.
+ // This derived class additionally sets MULTILINE(1), MULTISELECTABLE(+),
+ // FOCUSABLE(+) and FOCUSED(+)
+ virtual void GetStates( ::utl::AccessibleStateSetHelper& rStateSet ) override;
+
+ virtual void InvalidateContent_( bool bVisibleDataFired ) override;
+
+ virtual void InvalidateCursorPos_() override;
+ virtual void InvalidateFocus_() override;
+
+ virtual ~SwAccessibleParagraph() override;
+
+ // handling of data for the text portions
+
+ // force update of new portion data
+ /// @throws css::uno::RuntimeException
+ void UpdatePortionData();
+
+ // remove the current portion data
+ void ClearPortionData();
+
+ // get portion data; update if necessary
+ /// @throws css::uno::RuntimeException
+ SwAccessiblePortionData& GetPortionData()
+ {
+ if( m_pPortionData == nullptr )
+ UpdatePortionData();
+ return *m_pPortionData;
+ }
+
+ //helpers for word boundaries
+
+ bool GetCharBoundary( css::i18n::Boundary& rBound,
+ sal_Int32 nPos );
+ bool GetWordBoundary( css::i18n::Boundary& rBound,
+ const OUString& rText,
+ sal_Int32 nPos );
+ bool GetSentenceBoundary( css::i18n::Boundary& rBound,
+ const OUString& rText,
+ sal_Int32 nPos );
+ bool GetLineBoundary( css::i18n::Boundary& rBound,
+ const OUString& rText,
+ sal_Int32 nPos );
+ static bool GetParagraphBoundary( css::i18n::Boundary& rBound,
+ const OUString& rText );
+ bool GetAttributeBoundary( css::i18n::Boundary& rBound,
+ sal_Int32 nPos );
+ bool GetGlyphBoundary( css::i18n::Boundary& rBound,
+ const OUString& rText,
+ sal_Int32 nPos );
+
+ // get boundaries of word/sentence/etc. for specified text type
+ // Does all argument checking, and then delegates to helper methods above.
+ /// @throws css::lang::IndexOutOfBoundsException
+ /// @throws css::lang::IllegalArgumentException
+ /// @throws css::uno::RuntimeException
+ bool GetTextBoundary( css::i18n::Boundary& rBound,
+ const OUString& rText,
+ sal_Int32 nPos,
+ sal_Int16 aTextType );
+
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+public:
+
+ SwAccessibleParagraph( std::shared_ptr<SwAccessibleMap> const& pInitMap,
+ const SwTextFrame& rTextFrame );
+
+ inline operator css::accessibility::XAccessibleText *();
+
+ virtual bool HasCursor() override; // required by map to remember that object
+
+ css::uno::Sequence< css::style::TabStop > GetCurrentTabStop( sal_Int32 nIndex );
+ virtual sal_Int16 SAL_CALL getAccessibleRole() override;
+
+ // XAccessibleContext
+
+ // Return this object's description.
+ virtual OUString SAL_CALL
+ getAccessibleDescription() override;
+
+ // Return the parents locale or throw exception if this object has no
+ // parent yet/anymore.
+ virtual css::lang::Locale SAL_CALL
+ getLocale() override;
+
+ // #i27138# - paragraphs are in relation CONTENT_FLOWS_FROM and/or CONTENT_FLOWS_TO
+ virtual css::uno::Reference<
+ css::accessibility::XAccessibleRelationSet> SAL_CALL
+ getAccessibleRelationSet() override;
+
+ // XAccessibleComponent
+
+ virtual void SAL_CALL grabFocus() override;
+ // #i71385#
+ virtual sal_Int32 SAL_CALL getForeground() override;
+ virtual sal_Int32 SAL_CALL getBackground() override;
+
+ // XServiceInfo
+
+ // Returns an identifier for the implementation of this object.
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ // Return whether the specified service is supported by this class.
+ virtual sal_Bool SAL_CALL
+ supportsService (const OUString& sServiceName) override;
+
+ // Returns a list of all supported services. In this case that is just
+ // the AccessibleContext service.
+ virtual css::uno::Sequence< OUString> SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XInterface
+
+ // (XInterface methods need to be implemented to disambiguate
+ // between those inherited through SwAccessibleContext and
+ // XAccessibleEditableText).
+
+ virtual css::uno::Any SAL_CALL queryInterface(
+ const css::uno::Type& aType ) override;
+
+ virtual void SAL_CALL acquire( ) noexcept override
+ { SwAccessibleContext::acquire(); };
+
+ virtual void SAL_CALL release( ) noexcept override
+ { SwAccessibleContext::release(); };
+
+ // XTypeProvider
+ virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override;
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId( ) override;
+
+ // XAccessibleText
+ virtual sal_Int32 SAL_CALL getCaretPosition() override;
+ virtual sal_Bool SAL_CALL setCaretPosition( sal_Int32 nIndex ) override;
+ virtual sal_Unicode SAL_CALL getCharacter( sal_Int32 nIndex ) override;
+ virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL getCharacterAttributes( sal_Int32 nIndex, const css::uno::Sequence< OUString >& aRequestedAttributes ) override;
+ virtual css::awt::Rectangle SAL_CALL getCharacterBounds( sal_Int32 nIndex ) override;
+ virtual sal_Int32 SAL_CALL getCharacterCount( ) override;
+ virtual sal_Int32 SAL_CALL getIndexAtPoint( const css::awt::Point& aPoint ) override;
+ virtual OUString SAL_CALL getSelectedText( ) override;
+ virtual sal_Int32 SAL_CALL getSelectionStart() override;
+ virtual sal_Int32 SAL_CALL getSelectionEnd() override;
+ virtual sal_Bool SAL_CALL setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
+ virtual OUString SAL_CALL getText( ) override;
+ virtual OUString SAL_CALL getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
+ virtual css::accessibility::TextSegment SAL_CALL getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
+ virtual css::accessibility::TextSegment SAL_CALL getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
+ virtual css::accessibility::TextSegment SAL_CALL getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
+ virtual sal_Bool SAL_CALL copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
+ virtual sal_Bool SAL_CALL scrollSubstringTo( sal_Int32 nStartIndex, sal_Int32 nEndIndex, css::accessibility::AccessibleScrollType aScrollType) override;
+
+ // XAccessibleEditableText
+ virtual sal_Bool SAL_CALL cutText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
+ virtual sal_Bool SAL_CALL pasteText( sal_Int32 nIndex ) override;
+ virtual sal_Bool SAL_CALL deleteText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
+ virtual sal_Bool SAL_CALL insertText( const OUString& sText, sal_Int32 nIndex ) override;
+ virtual sal_Bool SAL_CALL replaceText( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const OUString& sReplacement ) override;
+ virtual sal_Bool SAL_CALL setAttributes( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const css::uno::Sequence< css::beans::PropertyValue >& aAttributeSet ) override;
+ virtual sal_Bool SAL_CALL setText( const OUString& sText ) override;
+
+ // XAccessibleSelection
+ virtual void SAL_CALL selectAccessibleChild(
+ sal_Int32 nChildIndex ) override;
+
+ virtual sal_Bool SAL_CALL isAccessibleChildSelected(
+ sal_Int32 nChildIndex ) override;
+ virtual void SAL_CALL clearAccessibleSelection( ) override;
+ virtual void SAL_CALL selectAllAccessibleChildren( ) override;
+ virtual sal_Int32 SAL_CALL getSelectedAccessibleChildCount( ) override;
+ virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getSelectedAccessibleChild(
+ sal_Int32 nSelectedChildIndex ) override;
+
+ // index has to be treated as global child index.
+ virtual void SAL_CALL deselectAccessibleChild(
+ sal_Int32 nChildIndex ) override;
+
+ // XAccessibleHypertext
+ virtual sal_Int32 SAL_CALL getHyperLinkCount() override;
+ virtual css::uno::Reference<
+ css::accessibility::XAccessibleHyperlink >
+ SAL_CALL getHyperLink( sal_Int32 nLinkIndex ) override;
+ virtual sal_Int32 SAL_CALL getHyperLinkIndex( sal_Int32 nCharIndex ) override;
+
+ // #i71360#
+ // XAccessibleTextMarkup
+ virtual sal_Int32 SAL_CALL getTextMarkupCount( sal_Int32 nTextMarkupType ) override;
+
+ virtual css::accessibility::TextSegment SAL_CALL
+ getTextMarkup( sal_Int32 nTextMarkupIndex,
+ sal_Int32 nTextMarkupType ) override;
+
+ virtual css::uno::Sequence< css::accessibility::TextSegment > SAL_CALL
+ getTextMarkupAtIndex( sal_Int32 nCharIndex,
+ sal_Int32 nTextMarkupType ) override;
+
+ // XAccessibleTextSelection
+ virtual sal_Bool SAL_CALL scrollToPosition( const css::awt::Point& aPoint, sal_Bool isLeftTop ) override;
+ virtual sal_Int32 SAL_CALL getSelectedPortionCount( ) override;
+ virtual sal_Int32 SAL_CALL getSeletedPositionStart( sal_Int32 nSelectedPortionIndex ) override;
+ virtual sal_Int32 SAL_CALL getSeletedPositionEnd( sal_Int32 nSelectedPortionIndex ) override;
+ virtual sal_Bool SAL_CALL removeSelection( sal_Int32 selectionIndex ) override;
+ virtual sal_Int32 SAL_CALL addSelection( sal_Int32 selectionIndex, sal_Int32 startOffset, sal_Int32 endOffset) override;
+ // XAccessibleExtendedAttributes
+ virtual css::uno::Any SAL_CALL getExtendedAttributes() override ;
+ sal_Int32 GetRealHeadingLevel();
+
+ // #i89175#
+ // XAccessibleMultiLineText
+ virtual sal_Int32 SAL_CALL getLineNumberAtIndex( sal_Int32 nIndex ) override;
+
+ virtual css::accessibility::TextSegment SAL_CALL
+ getTextAtLineNumber( sal_Int32 nLineNo ) override;
+
+ virtual css::accessibility::TextSegment SAL_CALL
+ getTextAtLineWithCaret() override;
+
+ virtual sal_Int32 SAL_CALL getNumberOfLineWithCaret() override;
+
+ // #i63870#
+ // XAccessibleTextAttributes
+ virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL getDefaultAttributes( const css::uno::Sequence< OUString >& aRequestedAttributes ) override;
+ virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL getRunAttributes( sal_Int32 nIndex, const css::uno::Sequence< OUString >& aRequestedAttributes ) override;
+};
+
+inline SwAccessibleParagraph::operator css::accessibility::XAccessibleText *()
+{
+ return static_cast< css::accessibility::XAccessibleEditableText * >( this );
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */