Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <textmarkuphelper.hxx>
21 : #include <accportions.hxx>
22 :
23 : #include <vector>
24 : #include <algorithm>
25 :
26 : #include <com/sun/star/text/TextMarkupType.hpp>
27 : #include <com/sun/star/accessibility/TextSegment.hpp>
28 :
29 : #include <ndtxt.hxx>
30 : #include <wrong.hxx>
31 :
32 : using namespace com::sun::star;
33 :
34 : // helper functions
35 : namespace {
36 0 : const SwWrongList* getTextMarkupList( const SwTextNode& rTextNode,
37 : const sal_Int32 nTextMarkupType )
38 : throw (::com::sun::star::lang::IllegalArgumentException,
39 : ::com::sun::star::uno::RuntimeException)
40 : {
41 0 : const SwWrongList* pTextMarkupList( 0 );
42 0 : switch ( nTextMarkupType )
43 : {
44 : case text::TextMarkupType::SPELLCHECK:
45 : {
46 0 : pTextMarkupList = rTextNode.GetWrong();
47 : }
48 0 : break;
49 : case text::TextMarkupType::PROOFREADING:
50 : {
51 : // support not implemented yet
52 0 : pTextMarkupList = 0;
53 : }
54 0 : break;
55 : case text::TextMarkupType::SMARTTAG:
56 : {
57 : // support not implemented yet
58 0 : pTextMarkupList = 0;
59 : }
60 0 : break;
61 : default:
62 : {
63 0 : throw lang::IllegalArgumentException();
64 : }
65 : }
66 :
67 0 : return pTextMarkupList;
68 : }
69 : }
70 :
71 : // implementation of class <SwTextMarkupoHelper>
72 0 : SwTextMarkupHelper::SwTextMarkupHelper( const SwAccessiblePortionData& rPortionData,
73 : const SwTextNode& rTextNode )
74 : : mrPortionData( rPortionData )
75 : // #i108125#
76 : , mpTextNode( &rTextNode )
77 0 : , mpTextMarkupList( 0 )
78 : {
79 0 : }
80 :
81 : // #i108125#
82 0 : SwTextMarkupHelper::SwTextMarkupHelper( const SwAccessiblePortionData& rPortionData,
83 : const SwWrongList& rTextMarkupList )
84 : : mrPortionData( rPortionData )
85 : , mpTextNode( 0 )
86 0 : , mpTextMarkupList( &rTextMarkupList )
87 : {
88 0 : }
89 :
90 0 : sal_Int32 SwTextMarkupHelper::getTextMarkupCount( const sal_Int32 nTextMarkupType )
91 : throw (::com::sun::star::lang::IllegalArgumentException,
92 : ::com::sun::star::uno::RuntimeException)
93 : {
94 0 : sal_Int32 nTextMarkupCount( 0 );
95 :
96 : // #i108125#
97 : const SwWrongList* pTextMarkupList =
98 : mpTextMarkupList
99 : ? mpTextMarkupList
100 0 : : getTextMarkupList( *mpTextNode, nTextMarkupType );
101 0 : if ( pTextMarkupList )
102 : {
103 0 : nTextMarkupCount = pTextMarkupList->Count();
104 : }
105 :
106 0 : return nTextMarkupCount;
107 : }
108 :
109 : ::com::sun::star::accessibility::TextSegment
110 0 : SwTextMarkupHelper::getTextMarkup( const sal_Int32 nTextMarkupIndex,
111 : const sal_Int32 nTextMarkupType )
112 : throw (::com::sun::star::lang::IndexOutOfBoundsException,
113 : ::com::sun::star::lang::IllegalArgumentException,
114 : ::com::sun::star::uno::RuntimeException)
115 : {
116 0 : if ( nTextMarkupIndex >= getTextMarkupCount( nTextMarkupType ) ||
117 : nTextMarkupIndex < 0 )
118 : {
119 0 : throw lang::IndexOutOfBoundsException();
120 : }
121 :
122 0 : ::com::sun::star::accessibility::TextSegment aTextMarkupSegment;
123 0 : aTextMarkupSegment.SegmentStart = -1;
124 0 : aTextMarkupSegment.SegmentEnd = -1;
125 :
126 : // #i108125#
127 : const SwWrongList* pTextMarkupList =
128 : mpTextMarkupList
129 : ? mpTextMarkupList
130 0 : : getTextMarkupList( *mpTextNode, nTextMarkupType );
131 0 : if ( pTextMarkupList )
132 : {
133 : const SwWrongArea* pTextMarkup =
134 0 : pTextMarkupList->GetElement( static_cast<sal_uInt16>(nTextMarkupIndex) );
135 0 : if ( pTextMarkup )
136 : {
137 0 : const OUString rText = mrPortionData.GetAccessibleString();
138 : const sal_Int32 nStartPos =
139 0 : mrPortionData.GetAccessiblePosition( pTextMarkup->mnPos );
140 : const sal_Int32 nEndPos =
141 0 : mrPortionData.GetAccessiblePosition( pTextMarkup->mnPos + pTextMarkup->mnLen );
142 0 : aTextMarkupSegment.SegmentText = rText.copy( nStartPos, nEndPos - nStartPos );
143 0 : aTextMarkupSegment.SegmentStart = nStartPos;
144 0 : aTextMarkupSegment.SegmentEnd = nEndPos;
145 : }
146 : else
147 : {
148 : OSL_FAIL( "<SwTextMarkupHelper::getTextMarkup(..)> - missing <SwWrongArea> instance" );
149 : }
150 : }
151 :
152 0 : return aTextMarkupSegment;
153 : }
154 :
155 : ::com::sun::star::uno::Sequence< ::com::sun::star::accessibility::TextSegment >
156 0 : SwTextMarkupHelper::getTextMarkupAtIndex( const sal_Int32 nCharIndex,
157 : const sal_Int32 nTextMarkupType )
158 : throw (::com::sun::star::lang::IndexOutOfBoundsException,
159 : ::com::sun::star::lang::IllegalArgumentException,
160 : ::com::sun::star::uno::RuntimeException)
161 : {
162 : // assumption:
163 : // value of <nCharIndex> is in range [0..length of accessible text)
164 :
165 0 : const sal_Int32 nCoreCharIndex = mrPortionData.GetModelPosition( nCharIndex );
166 : // Handling of portions with core length == 0 at the beginning of the
167 : // paragraph - e.g. numbering portion.
168 0 : if ( mrPortionData.GetAccessiblePosition( nCoreCharIndex ) > nCharIndex )
169 : {
170 0 : return uno::Sequence< ::com::sun::star::accessibility::TextSegment >();
171 : }
172 :
173 : // #i108125#
174 : const SwWrongList* pTextMarkupList =
175 : mpTextMarkupList
176 : ? mpTextMarkupList
177 0 : : getTextMarkupList( *mpTextNode, nTextMarkupType );
178 0 : ::std::vector< ::com::sun::star::accessibility::TextSegment > aTmpTextMarkups;
179 0 : if ( pTextMarkupList )
180 : {
181 0 : const OUString rText = mrPortionData.GetAccessibleString();
182 :
183 0 : const sal_uInt16 nTextMarkupCount = pTextMarkupList->Count();
184 0 : for ( sal_uInt16 nTextMarkupIdx = 0; nTextMarkupIdx < nTextMarkupCount; ++nTextMarkupIdx )
185 : {
186 0 : const SwWrongArea* pTextMarkup = pTextMarkupList->GetElement( nTextMarkupIdx );
187 : OSL_ENSURE( pTextMarkup,
188 : "<SwTextMarkupHelper::getTextMarkup(..)> - missing <SwWrongArea> instance" );
189 0 : if ( pTextMarkup &&
190 0 : pTextMarkup->mnPos <= nCoreCharIndex &&
191 0 : nCoreCharIndex < ( pTextMarkup->mnPos + pTextMarkup->mnLen ) )
192 : {
193 : const sal_Int32 nStartPos =
194 0 : mrPortionData.GetAccessiblePosition( pTextMarkup->mnPos );
195 : const sal_Int32 nEndPos =
196 0 : mrPortionData.GetAccessiblePosition( pTextMarkup->mnPos + pTextMarkup->mnLen );
197 0 : ::com::sun::star::accessibility::TextSegment aTextMarkupSegment;
198 0 : aTextMarkupSegment.SegmentText = rText.copy( nStartPos, nEndPos - nStartPos );
199 0 : aTextMarkupSegment.SegmentStart = nStartPos;
200 0 : aTextMarkupSegment.SegmentEnd = nEndPos;
201 0 : aTmpTextMarkups.push_back( aTextMarkupSegment );
202 : }
203 0 : }
204 : }
205 :
206 : uno::Sequence< ::com::sun::star::accessibility::TextSegment > aTextMarkups(
207 0 : aTmpTextMarkups.size() );
208 0 : ::std::copy( aTmpTextMarkups.begin(), aTmpTextMarkups.end(), aTextMarkups.begin() );
209 :
210 0 : return aTextMarkups;
211 177 : }
212 :
213 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|