summaryrefslogtreecommitdiff
path: root/sw/source/core/access/accportions.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/access/accportions.hxx')
-rw-r--r--sw/source/core/access/accportions.hxx177
1 files changed, 177 insertions, 0 deletions
diff --git a/sw/source/core/access/accportions.hxx b/sw/source/core/access/accportions.hxx
new file mode 100644
index 000000000000..ef04e7ff56eb
--- /dev/null
+++ b/sw/source/core/access/accportions.hxx
@@ -0,0 +1,177 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _ACCPORTIONS_HXX
+#define _ACCPORTIONS_HXX
+#include <SwPortionHandler.hxx>
+#include <sal/types.h>
+#include <rtl/ustrbuf.hxx>
+#include <vector>
+
+class String;
+class SwTxtNode;
+struct SwSpecialPos;
+class SwViewOption;
+namespace com { namespace sun { namespace star {
+ namespace i18n { struct Boundary; }
+} } }
+
+/**
+ * collect text portion data from the layout through SwPortionHandler interface
+ */
+class SwAccessiblePortionData : public SwPortionHandler
+{
+ // the node this portion is referring to
+ const SwTxtNode* pTxtNode;
+
+ // variables used while collecting the data
+ rtl::OUStringBuffer aBuffer;
+ sal_Int32 nModelPosition;
+ sal_Bool bFinished;
+ const SwViewOption* pViewOptions;
+
+ // the accessible string
+ rtl::OUString sAccessibleString;
+
+ // positions array
+ // instances of Position_t must always include the minimum and
+ // maximum positions as first/last elements (to simplify the
+ // algorithms)
+ typedef std::vector<sal_Int32> Positions_t;
+
+ Positions_t aLineBreaks; /// position of line breaks
+ Positions_t aModelPositions; /// position of portion breaks in the model
+ Positions_t aAccessiblePositions; /// portion breaks in sAccessibleString
+
+ typedef std::vector<sal_uInt8> PortionAttrs_t;
+ PortionAttrs_t aPortionAttrs; /// additional portion attributes
+
+ Positions_t* pSentences; /// positions of sentence breaks
+
+ size_t nBeforePortions; /// # of portions before first model character
+ sal_Bool bLastIsSpecial; /// set if last portion was 'Special()'
+
+ /// returns the index of the first position whose value is smaller
+ /// or equal, and whose following value is equal or larger
+ size_t FindBreak( const Positions_t& rPositions, sal_Int32 nValue ) const;
+
+ /// like FindBreak, but finds the last equal or larger position
+ size_t FindLastBreak( const Positions_t& rPositions, sal_Int32 nValue ) const;
+
+ /// fill the boundary with the values from rPositions[nPos]
+ void FillBoundary(com::sun::star::i18n::Boundary& rBound,
+ const Positions_t& rPositions,
+ size_t nPos ) const;
+
+ /// Access to portion attributes
+ sal_Bool IsPortionAttrSet( size_t nPortionNo, sal_uInt8 nAttr ) const;
+ sal_Bool IsSpecialPortion( size_t nPortionNo ) const;
+ sal_Bool IsReadOnlyPortion( size_t nPortionNo ) const;
+ sal_Bool IsGrayPortionType( sal_uInt16 nType ) const;
+
+ // helper method for GetEditableRange(...):
+ void AdjustAndCheck( sal_Int32 nPos, size_t& nPortionNo,
+ sal_uInt16& nCorePos, sal_Bool& bEdit ) const;
+
+public:
+ SwAccessiblePortionData( const SwTxtNode* pTxtNd,
+ const SwViewOption* pViewOpt = NULL );
+ virtual ~SwAccessiblePortionData();
+
+ // SwPortionHandler methods
+ virtual void Text(sal_uInt16 nLength, sal_uInt16 nType);
+ virtual void Special(sal_uInt16 nLength, const String& rText, sal_uInt16 nType);
+ virtual void LineBreak();
+ virtual void Skip(sal_uInt16 nLength);
+ virtual void Finish();
+
+
+ // access to the portion data
+
+ /// get the text string, as presented by the layout
+ const rtl::OUString& GetAccessibleString() const;
+
+ /// get the start & end positions of the sentence
+ void GetLineBoundary( com::sun::star::i18n::Boundary& rBound,
+ sal_Int32 nPos ) const;
+
+ // get start and end position of the last line
+ void GetLastLineBoundary( com::sun::star::i18n::Boundary& rBound ) const;
+
+ // #i89175#
+ sal_Int32 GetLineCount() const;
+ sal_Int32 GetLineNo( const sal_Int32 nPos ) const;
+ void GetBoundaryOfLine( const sal_Int32 nLineNo,
+ com::sun::star::i18n::Boundary& rLineBound );
+ // <--
+
+ /// get the position in the model string for a given
+ /// (accessibility) position
+ sal_uInt16 GetModelPosition( sal_Int32 nPos ) const;
+
+ /// get the position in the accessibility string for a given model position
+ sal_Int32 GetAccessiblePosition( sal_uInt16 nPos ) const;
+
+ /// fill a SwSpecialPos structure, suitable for calling
+ /// SwTxtFrm->GetCharRect
+ /// Returns the core position, and fills thr rpPos either with NULL or
+ /// with the &rPos, after putting the appropriate data into it.
+ sal_uInt16 FillSpecialPos( sal_Int32 nPos,
+ SwSpecialPos& rPos,
+ SwSpecialPos*& rpPos ) const;
+
+
+ // get boundaries of words/sentences. The data structures are
+ // created on-demand.
+ void GetSentenceBoundary( com::sun::star::i18n::Boundary& rBound,
+ sal_Int32 nPos );
+
+ // get (a) boundary for attribut change
+ void GetAttributeBoundary( com::sun::star::i18n::Boundary& rBound,
+ sal_Int32 nPos ) const;
+
+ /// Convert start and end positions into core positions.
+ /// @returns true if 'special' portions are included either completely
+ /// or not at all. This can be used to test whether editing
+ /// that range would be legal
+ sal_Bool GetEditableRange( sal_Int32 nStart, sal_Int32 nEnd,
+ sal_uInt16& nCoreStart, sal_uInt16& nCoreEnd ) const;
+
+ /// Determine whether this core position is valid for these portions.
+ /// (A paragraph may be split into several frames, e.g. at page
+ /// boundaries. In this case, only part of a paragraph is represented
+ /// through this object. This method determines whether one particular
+ /// position is valid for this object or not.)
+ sal_Bool IsValidCorePosition( sal_uInt16 nPos ) const;
+ sal_uInt16 GetFirstValidCorePosition() const;
+ sal_uInt16 GetLastValidCorePosition() const;
+};
+
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */