xref: /AOO41X/main/winaccessibility/source/UAccCOM/AccTextBase.cpp (revision 5fdc4257b5e43545f8f7841d9e8303d3a99b1714)
1*5fdc4257SSteve Yin /*************************************************************************
2*5fdc4257SSteve Yin  *
3*5fdc4257SSteve Yin  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*5fdc4257SSteve Yin  *
5*5fdc4257SSteve Yin  * Copyright IBM Corporation 2010.
6*5fdc4257SSteve Yin  * Copyright 2000, 2010 Oracle and/or its affiliates.
7*5fdc4257SSteve Yin  *
8*5fdc4257SSteve Yin  * OpenOffice.org - a multi-platform office productivity suite
9*5fdc4257SSteve Yin  *
10*5fdc4257SSteve Yin  * This file is part of OpenOffice.org.
11*5fdc4257SSteve Yin  *
12*5fdc4257SSteve Yin  * OpenOffice.org is free software: you can redistribute it and/or modify
13*5fdc4257SSteve Yin  * it under the terms of the GNU Lesser General Public License version 3
14*5fdc4257SSteve Yin  * only, as published by the Free Software Foundation.
15*5fdc4257SSteve Yin  *
16*5fdc4257SSteve Yin  * OpenOffice.org is distributed in the hope that it will be useful,
17*5fdc4257SSteve Yin  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18*5fdc4257SSteve Yin  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19*5fdc4257SSteve Yin  * GNU Lesser General Public License version 3 for more details
20*5fdc4257SSteve Yin  * (a copy is included in the LICENSE file that accompanied this code).
21*5fdc4257SSteve Yin  *
22*5fdc4257SSteve Yin  * You should have received a copy of the GNU Lesser General Public License
23*5fdc4257SSteve Yin  * version 3 along with OpenOffice.org.  If not, see
24*5fdc4257SSteve Yin  * <http://www.openoffice.org/license.html>
25*5fdc4257SSteve Yin  * for a copy of the LGPLv3 License.
26*5fdc4257SSteve Yin  *
27*5fdc4257SSteve Yin  ************************************************************************/
28*5fdc4257SSteve Yin 
29*5fdc4257SSteve Yin //////////////////////////////////////////////////////////////////////
30*5fdc4257SSteve Yin // AccTextBase.cpp: implementation of the CAccTextBase class.
31*5fdc4257SSteve Yin //////////////////////////////////////////////////////////////////////
32*5fdc4257SSteve Yin #include "stdafx.h"
33*5fdc4257SSteve Yin #include <string>
34*5fdc4257SSteve Yin #define WNT
35*5fdc4257SSteve Yin 
36*5fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleTextType.hpp>
37*5fdc4257SSteve Yin #include "AccTextBase.h"
38*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp>
39*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleContext.hpp>
40*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleComponent.hpp>
41*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleTextSelection.hpp>
42*5fdc4257SSteve Yin #include "MAccessible.h"
43*5fdc4257SSteve Yin 
44*5fdc4257SSteve Yin using namespace com::sun::star::accessibility;
45*5fdc4257SSteve Yin using namespace com::sun::star::uno;
46*5fdc4257SSteve Yin using namespace rtl;
47*5fdc4257SSteve Yin 
48*5fdc4257SSteve Yin //////////////////////////////////////////////////////////////////////
49*5fdc4257SSteve Yin // Construction/Destruction
50*5fdc4257SSteve Yin //////////////////////////////////////////////////////////////////////
51*5fdc4257SSteve Yin 
52*5fdc4257SSteve Yin OUString ReplaceFourChar(OUString oldOUString);
53*5fdc4257SSteve Yin 
54*5fdc4257SSteve Yin CAccTextBase::CAccTextBase()
55*5fdc4257SSteve Yin {}
56*5fdc4257SSteve Yin 
57*5fdc4257SSteve Yin CAccTextBase::~CAccTextBase()
58*5fdc4257SSteve Yin {}
59*5fdc4257SSteve Yin 
60*5fdc4257SSteve Yin 
61*5fdc4257SSteve Yin /**
62*5fdc4257SSteve Yin    * Get special selection.
63*5fdc4257SSteve Yin    * @param startOffset Start selection offset.
64*5fdc4257SSteve Yin    * @param endOffset   End selection offset.
65*5fdc4257SSteve Yin    * @param success     Variant to accept the result of if the method call is successful.
66*5fdc4257SSteve Yin    * @return Result.
67*5fdc4257SSteve Yin */
68*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_addSelection(long startOffset, long endOffset)
69*5fdc4257SSteve Yin {
70*5fdc4257SSteve Yin 
71*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
72*5fdc4257SSteve Yin 
73*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
74*5fdc4257SSteve Yin 
75*5fdc4257SSteve Yin     // #CHECK XInterface#
76*5fdc4257SSteve Yin     if(pUNOInterface == NULL)
77*5fdc4257SSteve Yin         return E_FAIL;
78*5fdc4257SSteve Yin 
79*5fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
80*5fdc4257SSteve Yin 
81*5fdc4257SSteve Yin     Reference< XAccessibleTextSelection > pRExtension(pRContext,UNO_QUERY);
82*5fdc4257SSteve Yin 
83*5fdc4257SSteve Yin     if( pRExtension.is() )
84*5fdc4257SSteve Yin     {
85*5fdc4257SSteve Yin         pRExtension->addSelection(0, startOffset, endOffset);
86*5fdc4257SSteve Yin         return S_OK;
87*5fdc4257SSteve Yin     }
88*5fdc4257SSteve Yin     else
89*5fdc4257SSteve Yin     {
90*5fdc4257SSteve Yin         GetXInterface()->setSelection(startOffset, endOffset);
91*5fdc4257SSteve Yin         return S_OK;
92*5fdc4257SSteve Yin     }
93*5fdc4257SSteve Yin 
94*5fdc4257SSteve Yin     return E_FAIL;
95*5fdc4257SSteve Yin 
96*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
97*5fdc4257SSteve Yin }
98*5fdc4257SSteve Yin 
99*5fdc4257SSteve Yin /**
100*5fdc4257SSteve Yin    * Get special attributes.
101*5fdc4257SSteve Yin    * @param offset Offset.
102*5fdc4257SSteve Yin    * @param startOffset Variant to accept start offset.
103*5fdc4257SSteve Yin    * @param endOffset   Variant to accept end offset.
104*5fdc4257SSteve Yin    * @param textAttributes     Variant to accept attributes.
105*5fdc4257SSteve Yin    * @return Result.
106*5fdc4257SSteve Yin */
107*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_attributes(long offset, long * startOffset, long * endOffset, BSTR * textAttributes)
108*5fdc4257SSteve Yin {
109*5fdc4257SSteve Yin 
110*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
111*5fdc4257SSteve Yin 
112*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
113*5fdc4257SSteve Yin 
114*5fdc4257SSteve Yin     if (startOffset == NULL || endOffset == NULL || textAttributes == NULL)
115*5fdc4257SSteve Yin         return E_INVALIDARG;
116*5fdc4257SSteve Yin     // #CHECK XInterface#
117*5fdc4257SSteve Yin     if(!pRXText.is())
118*5fdc4257SSteve Yin     {
119*5fdc4257SSteve Yin         return E_FAIL;
120*5fdc4257SSteve Yin     }
121*5fdc4257SSteve Yin 
122*5fdc4257SSteve Yin     if( offset < 0 || offset > GetXInterface()->getCharacterCount() )
123*5fdc4257SSteve Yin         return E_FAIL;
124*5fdc4257SSteve Yin 
125*5fdc4257SSteve Yin 	std::wstring strAttrs;
126*5fdc4257SSteve Yin 
127*5fdc4257SSteve Yin     strAttrs += L"Version:1;";
128*5fdc4257SSteve Yin 
129*5fdc4257SSteve Yin     Sequence< ::com::sun::star::beans::PropertyValue > pValues = GetXInterface()->getCharacterAttributes(offset, Sequence< rtl::OUString >());
130*5fdc4257SSteve Yin     int nCount = pValues.getLength();
131*5fdc4257SSteve Yin 
132*5fdc4257SSteve Yin     short numberingLevel = 0;
133*5fdc4257SSteve Yin     OUString numberingPrefix;
134*5fdc4257SSteve Yin 	Any anyNumRule;
135*5fdc4257SSteve Yin     bool bHaveNumberingPrefixAttr = false;
136*5fdc4257SSteve Yin 	bool bHaveNumberingLevel = false;
137*5fdc4257SSteve Yin 	bool bHaveNumberingRules = false;
138*5fdc4257SSteve Yin     for(int i =0; i<nCount; i++)
139*5fdc4257SSteve Yin     {
140*5fdc4257SSteve Yin 
141*5fdc4257SSteve Yin         ::com::sun::star::beans::PropertyValue &pValue = pValues[i];
142*5fdc4257SSteve Yin         if(pValue.Name.compareTo(OUString::createFromAscii("NumberingLevel"))==0)
143*5fdc4257SSteve Yin         {
144*5fdc4257SSteve Yin 			if (pValue.Value != Any())
145*5fdc4257SSteve Yin 				pValue.Value >>= numberingLevel;
146*5fdc4257SSteve Yin 			else
147*5fdc4257SSteve Yin 				numberingLevel = -1;
148*5fdc4257SSteve Yin 			bHaveNumberingLevel = true;
149*5fdc4257SSteve Yin             continue;
150*5fdc4257SSteve Yin         }
151*5fdc4257SSteve Yin         if(pValue.Name.compareTo(OUString::createFromAscii("NumberingPrefix"))==0)
152*5fdc4257SSteve Yin         {
153*5fdc4257SSteve Yin             pValue.Value >>=numberingPrefix;
154*5fdc4257SSteve Yin             bHaveNumberingPrefixAttr = true;
155*5fdc4257SSteve Yin             continue;
156*5fdc4257SSteve Yin         }
157*5fdc4257SSteve Yin         if(pValue.Name.compareTo(OUString::createFromAscii("NumberingRules"))==0)
158*5fdc4257SSteve Yin         {
159*5fdc4257SSteve Yin 			bHaveNumberingRules = true;
160*5fdc4257SSteve Yin 			anyNumRule = pValue.Value;
161*5fdc4257SSteve Yin 			continue;
162*5fdc4257SSteve Yin         }
163*5fdc4257SSteve Yin 		if (bHaveNumberingLevel && bHaveNumberingRules && bHaveNumberingPrefixAttr)
164*5fdc4257SSteve Yin 		{
165*5fdc4257SSteve Yin 			OLECHAR numProps[512] = {0};
166*5fdc4257SSteve Yin 			strAttrs+=L";";
167*5fdc4257SSteve Yin 			numberingPrefix = ReplaceFourChar(numberingPrefix);
168*5fdc4257SSteve Yin 			CMAccessible::get_OLECHAR4Numbering(anyNumRule,numberingLevel,numberingPrefix,numProps);
169*5fdc4257SSteve Yin 			strAttrs += numProps;
170*5fdc4257SSteve Yin 			bHaveNumberingLevel = 0;
171*5fdc4257SSteve Yin 			bHaveNumberingRules = 0;
172*5fdc4257SSteve Yin 		}
173*5fdc4257SSteve Yin 		if( (bHaveNumberingPrefixAttr && i > 1 ) ||
174*5fdc4257SSteve Yin 			(!bHaveNumberingPrefixAttr && i > 0 ) ) //element 0 is NumberingPrefix, not write alone
175*5fdc4257SSteve Yin 		{
176*5fdc4257SSteve Yin 			strAttrs+=L";";
177*5fdc4257SSteve Yin 		}
178*5fdc4257SSteve Yin         strAttrs += pValue.Name.getStr();
179*5fdc4257SSteve Yin         strAttrs += L":";
180*5fdc4257SSteve Yin 
181*5fdc4257SSteve Yin         OLECHAR pTemp[2048] = {0};
182*5fdc4257SSteve Yin 
183*5fdc4257SSteve Yin         if (pValue.Name.compareTo(OUString::createFromAscii("CharBackColor"))==0 ||
184*5fdc4257SSteve Yin                 pValue.Name.compareTo(OUString::createFromAscii("CharColor"))==0 ||
185*5fdc4257SSteve Yin                 pValue.Name.compareTo(OUString::createFromAscii("CharUnderlineColor"))==0 )
186*5fdc4257SSteve Yin         {
187*5fdc4257SSteve Yin             unsigned long nColor;
188*5fdc4257SSteve Yin             pValue.Value >>= nColor;
189*5fdc4257SSteve Yin             OLECHAR pBuf[64];
190*5fdc4257SSteve Yin             swprintf( pBuf, L"%08X", nColor );
191*5fdc4257SSteve Yin             pTemp[0]=L'#';
192*5fdc4257SSteve Yin             wcscat( pTemp, pBuf );
193*5fdc4257SSteve Yin 
194*5fdc4257SSteve Yin         }
195*5fdc4257SSteve Yin         else
196*5fdc4257SSteve Yin         {
197*5fdc4257SSteve Yin             CMAccessible::get_OLECHARFromAny(pValue.Value,pTemp);
198*5fdc4257SSteve Yin         }
199*5fdc4257SSteve Yin 
200*5fdc4257SSteve Yin         strAttrs +=pTemp;
201*5fdc4257SSteve Yin     }
202*5fdc4257SSteve Yin 	strAttrs +=L";";
203*5fdc4257SSteve Yin     // #CHECK#
204*5fdc4257SSteve Yin     if(*textAttributes)
205*5fdc4257SSteve Yin         SysFreeString(*textAttributes);
206*5fdc4257SSteve Yin     *textAttributes = SysAllocString(strAttrs.c_str());
207*5fdc4257SSteve Yin 
208*5fdc4257SSteve Yin     if( offset < GetXInterface()->getCharacterCount() )
209*5fdc4257SSteve Yin     {
210*5fdc4257SSteve Yin         TextSegment textSeg = GetXInterface()->getTextAtIndex(offset, AccessibleTextType::ATTRIBUTE_RUN);
211*5fdc4257SSteve Yin         *startOffset = textSeg.SegmentStart;
212*5fdc4257SSteve Yin         *endOffset = textSeg.SegmentEnd;
213*5fdc4257SSteve Yin     }
214*5fdc4257SSteve Yin     else
215*5fdc4257SSteve Yin     {
216*5fdc4257SSteve Yin         *startOffset = offset;
217*5fdc4257SSteve Yin         *endOffset = offset;
218*5fdc4257SSteve Yin     }
219*5fdc4257SSteve Yin 
220*5fdc4257SSteve Yin     return S_OK;
221*5fdc4257SSteve Yin 
222*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
223*5fdc4257SSteve Yin }
224*5fdc4257SSteve Yin 
225*5fdc4257SSteve Yin /**
226*5fdc4257SSteve Yin    * Get caret position.
227*5fdc4257SSteve Yin    * @param offset     Variant to accept caret offset.
228*5fdc4257SSteve Yin    * @return Result.
229*5fdc4257SSteve Yin */
230*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_caretOffset(long * offset)
231*5fdc4257SSteve Yin {
232*5fdc4257SSteve Yin 
233*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
234*5fdc4257SSteve Yin 
235*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
236*5fdc4257SSteve Yin 
237*5fdc4257SSteve Yin     if (offset == NULL)
238*5fdc4257SSteve Yin         return E_INVALIDARG;
239*5fdc4257SSteve Yin     // #CHECK XInterface#
240*5fdc4257SSteve Yin     if(!pRXText.is())
241*5fdc4257SSteve Yin     {
242*5fdc4257SSteve Yin         *offset = 0;
243*5fdc4257SSteve Yin         return S_OK;
244*5fdc4257SSteve Yin     }
245*5fdc4257SSteve Yin 
246*5fdc4257SSteve Yin     *offset = GetXInterface()->getCaretPosition();
247*5fdc4257SSteve Yin     return S_OK;
248*5fdc4257SSteve Yin 
249*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
250*5fdc4257SSteve Yin }
251*5fdc4257SSteve Yin 
252*5fdc4257SSteve Yin /**
253*5fdc4257SSteve Yin    * Get character count.
254*5fdc4257SSteve Yin    * @param nCharacters  Variant to accept character count.
255*5fdc4257SSteve Yin    * @return Result.
256*5fdc4257SSteve Yin */
257*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_characterCount(long * nCharacters)
258*5fdc4257SSteve Yin {
259*5fdc4257SSteve Yin 
260*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
261*5fdc4257SSteve Yin 
262*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
263*5fdc4257SSteve Yin 
264*5fdc4257SSteve Yin     if (nCharacters == NULL)
265*5fdc4257SSteve Yin         return E_INVALIDARG;
266*5fdc4257SSteve Yin     // #CHECK XInterface#
267*5fdc4257SSteve Yin     if(!pRXText.is())
268*5fdc4257SSteve Yin     {
269*5fdc4257SSteve Yin         *nCharacters = 0;
270*5fdc4257SSteve Yin         return S_OK;
271*5fdc4257SSteve Yin     }
272*5fdc4257SSteve Yin 
273*5fdc4257SSteve Yin     *nCharacters = GetXInterface()->getCharacterCount();
274*5fdc4257SSteve Yin     return S_OK;
275*5fdc4257SSteve Yin 
276*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
277*5fdc4257SSteve Yin }
278*5fdc4257SSteve Yin 
279*5fdc4257SSteve Yin /**
280*5fdc4257SSteve Yin    * Get character extents.
281*5fdc4257SSteve Yin    * @param offset  Offset.
282*5fdc4257SSteve Yin    * @param x Variant to accept x position.
283*5fdc4257SSteve Yin    * @param y Variant to accept y position.
284*5fdc4257SSteve Yin    * @param width Variant to accept width.
285*5fdc4257SSteve Yin    * @param Height Variant to accept height.
286*5fdc4257SSteve Yin    * @return Result.
287*5fdc4257SSteve Yin */
288*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_characterExtents(long offset, IA2CoordinateType coordType, long * x, long * y, long * width, long * height)
289*5fdc4257SSteve Yin {
290*5fdc4257SSteve Yin 
291*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
292*5fdc4257SSteve Yin 
293*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
294*5fdc4257SSteve Yin 
295*5fdc4257SSteve Yin     if (x == NULL || height == NULL || y == NULL || width == NULL)
296*5fdc4257SSteve Yin         return E_INVALIDARG;
297*5fdc4257SSteve Yin     // #CHECK XInterface#
298*5fdc4257SSteve Yin     if(!pRXText.is())
299*5fdc4257SSteve Yin         return E_FAIL;
300*5fdc4257SSteve Yin 
301*5fdc4257SSteve Yin     if(offset < 0 || offset > GetXInterface()->getCharacterCount() )
302*5fdc4257SSteve Yin         return E_FAIL;
303*5fdc4257SSteve Yin 
304*5fdc4257SSteve Yin     com::sun::star::awt::Rectangle rectangle;
305*5fdc4257SSteve Yin     rectangle = GetXInterface()->getCharacterBounds(offset);
306*5fdc4257SSteve Yin 
307*5fdc4257SSteve Yin     //IA2Point aPoint;
308*5fdc4257SSteve Yin     com::sun::star::awt::Point aPoint;
309*5fdc4257SSteve Yin 
310*5fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
311*5fdc4257SSteve Yin     if( !pRContext.is() )
312*5fdc4257SSteve Yin     {
313*5fdc4257SSteve Yin         return E_FAIL;
314*5fdc4257SSteve Yin     }
315*5fdc4257SSteve Yin     Reference<XAccessibleComponent> pRComp(pRContext,UNO_QUERY);
316*5fdc4257SSteve Yin     if( pRComp.is() )
317*5fdc4257SSteve Yin     {
318*5fdc4257SSteve Yin         if(coordType == IA2_COORDTYPE_SCREEN_RELATIVE)
319*5fdc4257SSteve Yin         {
320*5fdc4257SSteve Yin             ::com::sun::star::awt::Point pt = pRComp->getLocationOnScreen();
321*5fdc4257SSteve Yin             aPoint.X = pt.X;
322*5fdc4257SSteve Yin             aPoint.Y = pt.Y;
323*5fdc4257SSteve Yin         }
324*5fdc4257SSteve Yin         else if(coordType == IA2_COORDTYPE_PARENT_RELATIVE)
325*5fdc4257SSteve Yin         {
326*5fdc4257SSteve Yin             ::com::sun::star::awt::Point pt = pRComp->getLocation();
327*5fdc4257SSteve Yin             aPoint.X = pt.X;
328*5fdc4257SSteve Yin             aPoint.Y = pt.Y;
329*5fdc4257SSteve Yin         }
330*5fdc4257SSteve Yin     }
331*5fdc4257SSteve Yin     rectangle.X = rectangle.X + aPoint.X;
332*5fdc4257SSteve Yin     rectangle.Y = rectangle.Y + aPoint.Y;
333*5fdc4257SSteve Yin 
334*5fdc4257SSteve Yin     *x = rectangle.X;
335*5fdc4257SSteve Yin     *y = rectangle.Y;
336*5fdc4257SSteve Yin 
337*5fdc4257SSteve Yin     // GetXInterface()->getCharacterBounds() have different implement in different acc component
338*5fdc4257SSteve Yin     // But we need return the width/height == 1 for every component when offset == text length.
339*5fdc4257SSteve Yin     // So we ignore the return result of GetXInterface()->getCharacterBounds() when offset == text length.
340*5fdc4257SSteve Yin     if( offset == GetXInterface()->getCharacterCount() )
341*5fdc4257SSteve Yin     {
342*5fdc4257SSteve Yin         *width = 1;
343*5fdc4257SSteve Yin         *height = 1;
344*5fdc4257SSteve Yin     }
345*5fdc4257SSteve Yin     else
346*5fdc4257SSteve Yin     {
347*5fdc4257SSteve Yin         *width = rectangle.Width;
348*5fdc4257SSteve Yin         *height = rectangle.Height;
349*5fdc4257SSteve Yin     }
350*5fdc4257SSteve Yin 
351*5fdc4257SSteve Yin     return S_OK;
352*5fdc4257SSteve Yin 
353*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
354*5fdc4257SSteve Yin }
355*5fdc4257SSteve Yin 
356*5fdc4257SSteve Yin /**
357*5fdc4257SSteve Yin    * Get selections count.
358*5fdc4257SSteve Yin    * @param nSelections Variant to accept selections count.
359*5fdc4257SSteve Yin    * @return Result.
360*5fdc4257SSteve Yin */
361*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_nSelections(long * nSelections)
362*5fdc4257SSteve Yin {
363*5fdc4257SSteve Yin 
364*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
365*5fdc4257SSteve Yin 
366*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
367*5fdc4257SSteve Yin 
368*5fdc4257SSteve Yin     if (nSelections == NULL)
369*5fdc4257SSteve Yin         return E_INVALIDARG;
370*5fdc4257SSteve Yin     // #CHECK XInterface#
371*5fdc4257SSteve Yin     if(pUNOInterface == NULL)
372*5fdc4257SSteve Yin     {
373*5fdc4257SSteve Yin         *nSelections = 0;
374*5fdc4257SSteve Yin         return S_OK;
375*5fdc4257SSteve Yin     }
376*5fdc4257SSteve Yin 
377*5fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
378*5fdc4257SSteve Yin 
379*5fdc4257SSteve Yin     Reference< XAccessibleTextSelection > pRExtension(pRContext,UNO_QUERY);
380*5fdc4257SSteve Yin 
381*5fdc4257SSteve Yin     if( pRExtension.is() )
382*5fdc4257SSteve Yin     {
383*5fdc4257SSteve Yin         *nSelections = pRExtension->getSelectedPortionCount();
384*5fdc4257SSteve Yin         return S_OK;
385*5fdc4257SSteve Yin     }
386*5fdc4257SSteve Yin 
387*5fdc4257SSteve Yin     long iLength = GetXInterface()->getSelectedText().getLength();
388*5fdc4257SSteve Yin     if( iLength> 0)
389*5fdc4257SSteve Yin     {
390*5fdc4257SSteve Yin         *nSelections = 1;
391*5fdc4257SSteve Yin         return S_OK;
392*5fdc4257SSteve Yin     }
393*5fdc4257SSteve Yin 
394*5fdc4257SSteve Yin     *nSelections = 0;
395*5fdc4257SSteve Yin     return S_OK;
396*5fdc4257SSteve Yin 
397*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
398*5fdc4257SSteve Yin }
399*5fdc4257SSteve Yin 
400*5fdc4257SSteve Yin /**
401*5fdc4257SSteve Yin    * Get offset of some special point.
402*5fdc4257SSteve Yin    * @param x X position of one point.
403*5fdc4257SSteve Yin    * @param x Y position of one point.
404*5fdc4257SSteve Yin    * @param coordType Type.
405*5fdc4257SSteve Yin    * @param offset Variant to accept offset.
406*5fdc4257SSteve Yin    * @return Result.
407*5fdc4257SSteve Yin */
408*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_offsetAtPoint(long x, long y, IA2CoordinateType, long * offset)
409*5fdc4257SSteve Yin {
410*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
411*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
412*5fdc4257SSteve Yin 
413*5fdc4257SSteve Yin     if (offset == NULL)
414*5fdc4257SSteve Yin         return E_INVALIDARG;
415*5fdc4257SSteve Yin     // #CHECK XInterface#
416*5fdc4257SSteve Yin     if(!pRXText.is())
417*5fdc4257SSteve Yin         return E_FAIL;
418*5fdc4257SSteve Yin 
419*5fdc4257SSteve Yin     com::sun::star::awt::Point point;
420*5fdc4257SSteve Yin     point.X = x;
421*5fdc4257SSteve Yin     point.Y = y;
422*5fdc4257SSteve Yin     *offset = GetXInterface()->getIndexAtPoint(point);
423*5fdc4257SSteve Yin     return S_OK;
424*5fdc4257SSteve Yin 
425*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
426*5fdc4257SSteve Yin }
427*5fdc4257SSteve Yin 
428*5fdc4257SSteve Yin /**
429*5fdc4257SSteve Yin    * Get selection range.
430*5fdc4257SSteve Yin    * @param selection selection count.
431*5fdc4257SSteve Yin    * @param startOffset Variant to accept the start offset of special selection.
432*5fdc4257SSteve Yin    * @param endOffset Variant to accept the end offset of special selection.
433*5fdc4257SSteve Yin    * @return Result.
434*5fdc4257SSteve Yin */
435*5fdc4257SSteve Yin 
436*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_selection(long selectionIndex, long * startOffset, long * endOffset)
437*5fdc4257SSteve Yin {
438*5fdc4257SSteve Yin 
439*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
440*5fdc4257SSteve Yin 
441*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
442*5fdc4257SSteve Yin 
443*5fdc4257SSteve Yin     if (startOffset == NULL || endOffset == NULL )
444*5fdc4257SSteve Yin         return E_INVALIDARG;
445*5fdc4257SSteve Yin     // #CHECK XInterface#
446*5fdc4257SSteve Yin     if(pUNOInterface == NULL )
447*5fdc4257SSteve Yin         return E_FAIL;
448*5fdc4257SSteve Yin 
449*5fdc4257SSteve Yin     long nSelection = 0;
450*5fdc4257SSteve Yin     get_nSelections(&nSelection);
451*5fdc4257SSteve Yin 
452*5fdc4257SSteve Yin     if(selectionIndex >= nSelection || selectionIndex < 0 )
453*5fdc4257SSteve Yin         return E_FAIL;
454*5fdc4257SSteve Yin 
455*5fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
456*5fdc4257SSteve Yin 
457*5fdc4257SSteve Yin     Reference< XAccessibleTextSelection > pRExtension(pRContext,UNO_QUERY);
458*5fdc4257SSteve Yin 
459*5fdc4257SSteve Yin     if( pRExtension.is() )
460*5fdc4257SSteve Yin     {
461*5fdc4257SSteve Yin         *startOffset = pRExtension->getSeletedPositionStart(selectionIndex);
462*5fdc4257SSteve Yin         *endOffset = pRExtension->getSeletedPositionEnd(selectionIndex);
463*5fdc4257SSteve Yin         return S_OK;
464*5fdc4257SSteve Yin     }
465*5fdc4257SSteve Yin     else if(GetXInterface()->getSelectionEnd() > -1)
466*5fdc4257SSteve Yin     {
467*5fdc4257SSteve Yin         *startOffset = GetXInterface()->getSelectionStart();
468*5fdc4257SSteve Yin         *endOffset = GetXInterface()->getSelectionEnd();
469*5fdc4257SSteve Yin         return S_OK;
470*5fdc4257SSteve Yin     }
471*5fdc4257SSteve Yin 
472*5fdc4257SSteve Yin     *startOffset = 0;
473*5fdc4257SSteve Yin     *endOffset = 0;
474*5fdc4257SSteve Yin     return E_FAIL;
475*5fdc4257SSteve Yin 
476*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
477*5fdc4257SSteve Yin }
478*5fdc4257SSteve Yin 
479*5fdc4257SSteve Yin /**
480*5fdc4257SSteve Yin    * Get special text.
481*5fdc4257SSteve Yin    * @param startOffset Start position of special range.
482*5fdc4257SSteve Yin    * @param endOffset   End position of special range.
483*5fdc4257SSteve Yin    * @param text        Variant to accept the text of special range.
484*5fdc4257SSteve Yin    * @return Result.
485*5fdc4257SSteve Yin */
486*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_text(long startOffset, long endOffset, BSTR * text)
487*5fdc4257SSteve Yin {
488*5fdc4257SSteve Yin 
489*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
490*5fdc4257SSteve Yin 
491*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
492*5fdc4257SSteve Yin 
493*5fdc4257SSteve Yin     if (text == NULL)
494*5fdc4257SSteve Yin         return E_INVALIDARG;
495*5fdc4257SSteve Yin     // #CHECK XInterface#
496*5fdc4257SSteve Yin     if(!pRXText.is())
497*5fdc4257SSteve Yin         return E_FAIL;
498*5fdc4257SSteve Yin 
499*5fdc4257SSteve Yin     if (endOffset < -1 || endOffset < startOffset )
500*5fdc4257SSteve Yin     {
501*5fdc4257SSteve Yin         return E_FAIL;
502*5fdc4257SSteve Yin     }
503*5fdc4257SSteve Yin 
504*5fdc4257SSteve Yin     ::rtl::OUString ouStr;
505*5fdc4257SSteve Yin     if (endOffset == -1 )
506*5fdc4257SSteve Yin     {
507*5fdc4257SSteve Yin         long nLen=0;
508*5fdc4257SSteve Yin         if(SUCCEEDED(get_characterCount(&nLen)))
509*5fdc4257SSteve Yin         {
510*5fdc4257SSteve Yin             ouStr = GetXInterface()->getTextRange( 0, nLen );
511*5fdc4257SSteve Yin         }
512*5fdc4257SSteve Yin     }
513*5fdc4257SSteve Yin     else
514*5fdc4257SSteve Yin     {
515*5fdc4257SSteve Yin         ouStr = GetXInterface()->getTextRange( startOffset, endOffset );
516*5fdc4257SSteve Yin     }
517*5fdc4257SSteve Yin 
518*5fdc4257SSteve Yin     SysFreeString(*text);
519*5fdc4257SSteve Yin     *text = SysAllocString((OLECHAR*)ouStr.getStr());
520*5fdc4257SSteve Yin     return S_OK;
521*5fdc4257SSteve Yin 
522*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
523*5fdc4257SSteve Yin }
524*5fdc4257SSteve Yin 
525*5fdc4257SSteve Yin /**
526*5fdc4257SSteve Yin    * Get special text before some position.
527*5fdc4257SSteve Yin    * @param offset Special position.
528*5fdc4257SSteve Yin    * @param boundaryType Boundary type.
529*5fdc4257SSteve Yin    * @param startOffset Variant to accept the start offset.
530*5fdc4257SSteve Yin    * @param endOffset   Variant to accept the end offset.
531*5fdc4257SSteve Yin    * @param text        Variant to accept the special text.
532*5fdc4257SSteve Yin    * @return Result.
533*5fdc4257SSteve Yin */
534*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_textBeforeOffset(long offset, IA2TextBoundaryType boundaryType, long * startOffset, long * endOffset, BSTR * text)
535*5fdc4257SSteve Yin {
536*5fdc4257SSteve Yin 
537*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
538*5fdc4257SSteve Yin 
539*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
540*5fdc4257SSteve Yin 
541*5fdc4257SSteve Yin     // #CHECK#
542*5fdc4257SSteve Yin     if (startOffset == NULL || endOffset == NULL || text == NULL)
543*5fdc4257SSteve Yin         return E_INVALIDARG;
544*5fdc4257SSteve Yin     // #CHECK XInterface#
545*5fdc4257SSteve Yin     if(!pRXText.is())
546*5fdc4257SSteve Yin         return E_FAIL;
547*5fdc4257SSteve Yin 
548*5fdc4257SSteve Yin     // In New UNO IAccessibleText.idl these constant values are defined as follows:
549*5fdc4257SSteve Yin     //
550*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_CHAR = -1;
551*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_TO_CURSOR_POS = -2;
552*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_WORD = -3;
553*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_WORD = -4;
554*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_SENTENCE = -5;
555*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_SENTENCE = -6;
556*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_LINE = -7;
557*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_LINE = -8;
558*5fdc4257SSteve Yin     //
559*5fdc4257SSteve Yin     // In UNO, the corresponding values are as follows:
560*5fdc4257SSteve Yin     //
561*5fdc4257SSteve Yin     //  const short CHARACTER = 1;
562*5fdc4257SSteve Yin     //  const short WORD = 2;
563*5fdc4257SSteve Yin     //  const short SENTENCE = 3;
564*5fdc4257SSteve Yin     //  const short PARAGRAPH = 4;
565*5fdc4257SSteve Yin     //  const short LINE = 5;
566*5fdc4257SSteve Yin     //  const short GLYPH = 6;
567*5fdc4257SSteve Yin     //  const short ATTRIBUTE_RUN = 7;
568*5fdc4257SSteve Yin     //
569*5fdc4257SSteve Yin 
570*5fdc4257SSteve Yin     long			lUnoBoundaryType;
571*5fdc4257SSteve Yin 
572*5fdc4257SSteve Yin     switch(boundaryType)
573*5fdc4257SSteve Yin     {
574*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_CHAR:
575*5fdc4257SSteve Yin         lUnoBoundaryType = 1; // CHARACTER;
576*5fdc4257SSteve Yin         break;
577*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_WORD:
578*5fdc4257SSteve Yin         lUnoBoundaryType = 2; // WORD;
579*5fdc4257SSteve Yin         break;
580*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_SENTENCE:
581*5fdc4257SSteve Yin         lUnoBoundaryType = 3; // SENTENCE;
582*5fdc4257SSteve Yin         break;
583*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_LINE:
584*5fdc4257SSteve Yin         lUnoBoundaryType = 5; // LINE;
585*5fdc4257SSteve Yin         break;
586*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_PARAGRAPH:
587*5fdc4257SSteve Yin         lUnoBoundaryType = 4;
588*5fdc4257SSteve Yin         break;
589*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_ALL:
590*5fdc4257SSteve Yin         {
591*5fdc4257SSteve Yin             long nChar;
592*5fdc4257SSteve Yin             get_nCharacters( &nChar );
593*5fdc4257SSteve Yin             *startOffset = 0;
594*5fdc4257SSteve Yin             *endOffset = nChar;
595*5fdc4257SSteve Yin             return get_text(0, nChar, text);
596*5fdc4257SSteve Yin         }
597*5fdc4257SSteve Yin         break;
598*5fdc4257SSteve Yin     default:
599*5fdc4257SSteve Yin         return E_FAIL;
600*5fdc4257SSteve Yin     }
601*5fdc4257SSteve Yin 
602*5fdc4257SSteve Yin     TextSegment segment = GetXInterface()->getTextBeforeIndex( offset, sal_Int16(lUnoBoundaryType));
603*5fdc4257SSteve Yin     ::rtl::OUString ouStr = segment.SegmentText;
604*5fdc4257SSteve Yin     SysFreeString(*text);
605*5fdc4257SSteve Yin     *text = SysAllocString((OLECHAR*)ouStr.getStr());
606*5fdc4257SSteve Yin     *startOffset = segment.SegmentStart;
607*5fdc4257SSteve Yin     *endOffset = segment.SegmentEnd;
608*5fdc4257SSteve Yin 
609*5fdc4257SSteve Yin     return S_OK;
610*5fdc4257SSteve Yin 
611*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
612*5fdc4257SSteve Yin }
613*5fdc4257SSteve Yin 
614*5fdc4257SSteve Yin /**
615*5fdc4257SSteve Yin    * Get special text after some position.
616*5fdc4257SSteve Yin    * @param offset Special position.
617*5fdc4257SSteve Yin    * @param boundaryType Boundary type.
618*5fdc4257SSteve Yin    * @param startOffset Variant to accept the start offset.
619*5fdc4257SSteve Yin    * @param endOffset   Variant to accept the end offset.
620*5fdc4257SSteve Yin    * @param text        Variant to accept the special text.
621*5fdc4257SSteve Yin    * @return Result.
622*5fdc4257SSteve Yin */
623*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_textAfterOffset(long offset, IA2TextBoundaryType boundaryType, long * startOffset, long * endOffset, BSTR * text)
624*5fdc4257SSteve Yin {
625*5fdc4257SSteve Yin 
626*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
627*5fdc4257SSteve Yin 
628*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
629*5fdc4257SSteve Yin 
630*5fdc4257SSteve Yin     if (startOffset == NULL || endOffset == NULL || text == NULL)
631*5fdc4257SSteve Yin         return E_INVALIDARG;
632*5fdc4257SSteve Yin     // #CHECK XInterface#
633*5fdc4257SSteve Yin     if(!pRXText.is())
634*5fdc4257SSteve Yin         return E_FAIL;
635*5fdc4257SSteve Yin 
636*5fdc4257SSteve Yin     // In New UNO IAccessibleText.idl these constant values are defined as follows:
637*5fdc4257SSteve Yin     //
638*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_CHAR = -1;
639*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_TO_CURSOR_POS = -2;
640*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_WORD = -3;
641*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_WORD = -4;
642*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_SENTENCE = -5;
643*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_SENTENCE = -6;
644*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_LINE = -7;
645*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_LINE = -8;
646*5fdc4257SSteve Yin     //
647*5fdc4257SSteve Yin     // In UNO, the corresponding values are as follows:
648*5fdc4257SSteve Yin     //
649*5fdc4257SSteve Yin     //  const short CHARACTER = 1;
650*5fdc4257SSteve Yin     //  const short WORD = 2;
651*5fdc4257SSteve Yin     //  const short SENTENCE = 3;
652*5fdc4257SSteve Yin     //  const short PARAGRAPH = 4;
653*5fdc4257SSteve Yin     //  const short LINE = 5;
654*5fdc4257SSteve Yin     //  const short GLYPH = 6;
655*5fdc4257SSteve Yin     //  const short ATTRIBUTE_RUN = 7;
656*5fdc4257SSteve Yin     //
657*5fdc4257SSteve Yin 
658*5fdc4257SSteve Yin     long			lUnoBoundaryType;
659*5fdc4257SSteve Yin     switch(boundaryType)
660*5fdc4257SSteve Yin     {
661*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_CHAR:
662*5fdc4257SSteve Yin         lUnoBoundaryType = 1; // CHARACTER;
663*5fdc4257SSteve Yin         break;
664*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_WORD:
665*5fdc4257SSteve Yin         lUnoBoundaryType = 2; // WORD;
666*5fdc4257SSteve Yin         break;
667*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_SENTENCE:
668*5fdc4257SSteve Yin         lUnoBoundaryType = 3; // SENTENCE;
669*5fdc4257SSteve Yin         break;
670*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_LINE:
671*5fdc4257SSteve Yin         lUnoBoundaryType = 5; // LINE;
672*5fdc4257SSteve Yin         break;
673*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_PARAGRAPH:
674*5fdc4257SSteve Yin         lUnoBoundaryType = 4;
675*5fdc4257SSteve Yin         break;
676*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_ALL:
677*5fdc4257SSteve Yin         {
678*5fdc4257SSteve Yin             long nChar;
679*5fdc4257SSteve Yin             get_nCharacters( &nChar );
680*5fdc4257SSteve Yin             *startOffset = 0;
681*5fdc4257SSteve Yin             *endOffset = nChar;
682*5fdc4257SSteve Yin             return get_text(0, nChar, text);
683*5fdc4257SSteve Yin         }
684*5fdc4257SSteve Yin         break;
685*5fdc4257SSteve Yin     default:
686*5fdc4257SSteve Yin         return E_FAIL;
687*5fdc4257SSteve Yin     }
688*5fdc4257SSteve Yin 
689*5fdc4257SSteve Yin     TextSegment segment = GetXInterface()->getTextBehindIndex( offset, sal_Int16(lUnoBoundaryType));
690*5fdc4257SSteve Yin     ::rtl::OUString ouStr = segment.SegmentText;
691*5fdc4257SSteve Yin     SysFreeString(*text);
692*5fdc4257SSteve Yin     *text = SysAllocString((OLECHAR*)ouStr.getStr());
693*5fdc4257SSteve Yin     *startOffset = segment.SegmentStart;
694*5fdc4257SSteve Yin     *endOffset = segment.SegmentEnd;
695*5fdc4257SSteve Yin 
696*5fdc4257SSteve Yin     return S_OK;
697*5fdc4257SSteve Yin 
698*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
699*5fdc4257SSteve Yin }
700*5fdc4257SSteve Yin 
701*5fdc4257SSteve Yin /**
702*5fdc4257SSteve Yin    * Get special text at some position.
703*5fdc4257SSteve Yin    * @param offset Special position.
704*5fdc4257SSteve Yin    * @param boundaryType Boundary type.
705*5fdc4257SSteve Yin    * @param startOffset Variant to accept the start offset.
706*5fdc4257SSteve Yin    * @param endOffset   Variant to accept the end offset.
707*5fdc4257SSteve Yin    * @param text        Variant to accept the special text.
708*5fdc4257SSteve Yin    * @return Result.
709*5fdc4257SSteve Yin */
710*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_textAtOffset(long offset, IA2TextBoundaryType boundaryType, long * startOffset, long * endOffset, BSTR * text)
711*5fdc4257SSteve Yin {
712*5fdc4257SSteve Yin 
713*5fdc4257SSteve Yin 
714*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
715*5fdc4257SSteve Yin 
716*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
717*5fdc4257SSteve Yin 
718*5fdc4257SSteve Yin     if (startOffset == NULL || text == NULL ||endOffset == NULL)
719*5fdc4257SSteve Yin         return E_INVALIDARG;
720*5fdc4257SSteve Yin     // #CHECK XInterface#
721*5fdc4257SSteve Yin     if(!pRXText.is())
722*5fdc4257SSteve Yin         return E_FAIL;
723*5fdc4257SSteve Yin 
724*5fdc4257SSteve Yin     // In New UNO IAccessibleText.idl these constant values are defined as follows:
725*5fdc4257SSteve Yin     //
726*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_CHAR = -1;
727*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_TO_CURSOR_POS = -2;
728*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_WORD = -3;
729*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_WORD = -4;
730*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_SENTENCE = -5;
731*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_SENTENCE = -6;
732*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_LINE = -7;
733*5fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_LINE = -8;
734*5fdc4257SSteve Yin     //
735*5fdc4257SSteve Yin     // In UNO, the corresponding values are as follows:
736*5fdc4257SSteve Yin     //
737*5fdc4257SSteve Yin     //  const short CHARACTER = 1;
738*5fdc4257SSteve Yin     //  const short WORD = 2;
739*5fdc4257SSteve Yin     //  const short SENTENCE = 3;
740*5fdc4257SSteve Yin     //  const short PARAGRAPH = 4;
741*5fdc4257SSteve Yin     //  const short LINE = 5;
742*5fdc4257SSteve Yin     //  const short GLYPH = 6;
743*5fdc4257SSteve Yin     //  const short ATTRIBUTE_RUN = 7;
744*5fdc4257SSteve Yin     //
745*5fdc4257SSteve Yin 
746*5fdc4257SSteve Yin     long			lUnoBoundaryType;
747*5fdc4257SSteve Yin 
748*5fdc4257SSteve Yin     switch(boundaryType)
749*5fdc4257SSteve Yin     {
750*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_CHAR:
751*5fdc4257SSteve Yin         lUnoBoundaryType = 1; // CHARACTER;
752*5fdc4257SSteve Yin         break;
753*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_WORD:
754*5fdc4257SSteve Yin         lUnoBoundaryType = 2; // WORD;
755*5fdc4257SSteve Yin         break;
756*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_SENTENCE:
757*5fdc4257SSteve Yin         lUnoBoundaryType = 3; // SENTENCE;
758*5fdc4257SSteve Yin         break;
759*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_LINE:
760*5fdc4257SSteve Yin         lUnoBoundaryType = 5; // LINE;
761*5fdc4257SSteve Yin         break;
762*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_PARAGRAPH:
763*5fdc4257SSteve Yin         lUnoBoundaryType = 4;
764*5fdc4257SSteve Yin         break;
765*5fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_ALL:
766*5fdc4257SSteve Yin         {
767*5fdc4257SSteve Yin             long nChar;
768*5fdc4257SSteve Yin             get_nCharacters( &nChar );
769*5fdc4257SSteve Yin             *startOffset = 0;
770*5fdc4257SSteve Yin             *endOffset = nChar;
771*5fdc4257SSteve Yin             return get_text(0, nChar, text);
772*5fdc4257SSteve Yin         }
773*5fdc4257SSteve Yin         break;
774*5fdc4257SSteve Yin     default:
775*5fdc4257SSteve Yin         return E_FAIL;
776*5fdc4257SSteve Yin     }
777*5fdc4257SSteve Yin 
778*5fdc4257SSteve Yin     TextSegment segment = GetXInterface()->getTextAtIndex( offset, sal_Int16(lUnoBoundaryType));
779*5fdc4257SSteve Yin     ::rtl::OUString ouStr = segment.SegmentText;
780*5fdc4257SSteve Yin     SysFreeString(*text);
781*5fdc4257SSteve Yin     *text = SysAllocString((OLECHAR*)ouStr.getStr());
782*5fdc4257SSteve Yin     *startOffset = segment.SegmentStart;
783*5fdc4257SSteve Yin     *endOffset = segment.SegmentEnd;
784*5fdc4257SSteve Yin 
785*5fdc4257SSteve Yin     return S_OK;
786*5fdc4257SSteve Yin 
787*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
788*5fdc4257SSteve Yin }
789*5fdc4257SSteve Yin 
790*5fdc4257SSteve Yin /**
791*5fdc4257SSteve Yin    * Remove selection.
792*5fdc4257SSteve Yin    * @param selectionIndex Special selection index
793*5fdc4257SSteve Yin    * @param success Variant to accept the memthod called result.
794*5fdc4257SSteve Yin    * @return Result.
795*5fdc4257SSteve Yin */
796*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::removeSelection(long selectionIndex)
797*5fdc4257SSteve Yin {
798*5fdc4257SSteve Yin 
799*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
800*5fdc4257SSteve Yin 
801*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
802*5fdc4257SSteve Yin 
803*5fdc4257SSteve Yin     // #CHECK XInterface#
804*5fdc4257SSteve Yin     if(pUNOInterface == NULL)
805*5fdc4257SSteve Yin     {
806*5fdc4257SSteve Yin         return E_FAIL;
807*5fdc4257SSteve Yin     }
808*5fdc4257SSteve Yin 
809*5fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
810*5fdc4257SSteve Yin 
811*5fdc4257SSteve Yin     Reference< XAccessibleTextSelection > pRExtension(pRContext,UNO_QUERY);
812*5fdc4257SSteve Yin 
813*5fdc4257SSteve Yin     if( pRExtension.is() )
814*5fdc4257SSteve Yin     {
815*5fdc4257SSteve Yin         pRExtension->removeSelection(selectionIndex);
816*5fdc4257SSteve Yin         return S_OK;
817*5fdc4257SSteve Yin     }
818*5fdc4257SSteve Yin 	else
819*5fdc4257SSteve Yin     {
820*5fdc4257SSteve Yin         GetXInterface()->setSelection(0, 0);
821*5fdc4257SSteve Yin         return S_OK;
822*5fdc4257SSteve Yin     }
823*5fdc4257SSteve Yin 
824*5fdc4257SSteve Yin     return E_FAIL;
825*5fdc4257SSteve Yin 
826*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
827*5fdc4257SSteve Yin }
828*5fdc4257SSteve Yin 
829*5fdc4257SSteve Yin /**
830*5fdc4257SSteve Yin    * Set caret position.
831*5fdc4257SSteve Yin    * @param offset Special position.
832*5fdc4257SSteve Yin    * @param success Variant to accept the memthod called result.
833*5fdc4257SSteve Yin    * @return Result.
834*5fdc4257SSteve Yin */
835*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::setCaretOffset(long offset)
836*5fdc4257SSteve Yin {
837*5fdc4257SSteve Yin 
838*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
839*5fdc4257SSteve Yin 
840*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
841*5fdc4257SSteve Yin 
842*5fdc4257SSteve Yin     // #CHECK XInterface#
843*5fdc4257SSteve Yin     if(!pRXText.is())
844*5fdc4257SSteve Yin         return E_FAIL;
845*5fdc4257SSteve Yin 
846*5fdc4257SSteve Yin     GetXInterface()->setCaretPosition( offset);
847*5fdc4257SSteve Yin 
848*5fdc4257SSteve Yin     return S_OK;
849*5fdc4257SSteve Yin 
850*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
851*5fdc4257SSteve Yin }
852*5fdc4257SSteve Yin 
853*5fdc4257SSteve Yin /**
854*5fdc4257SSteve Yin    * Set special selection.
855*5fdc4257SSteve Yin    * @param selectionIndex Special selection index.
856*5fdc4257SSteve Yin    * @param startOffset start position.
857*5fdc4257SSteve Yin    * @param endOffset end position.
858*5fdc4257SSteve Yin    * @param success Variant to accept the memthod called result.
859*5fdc4257SSteve Yin    * @return Result.
860*5fdc4257SSteve Yin */
861*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::setSelection(long, long startOffset, long endOffset)
862*5fdc4257SSteve Yin {
863*5fdc4257SSteve Yin 
864*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
865*5fdc4257SSteve Yin 
866*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
867*5fdc4257SSteve Yin 
868*5fdc4257SSteve Yin     // #CHECK XInterface#
869*5fdc4257SSteve Yin     if(!pRXText.is())
870*5fdc4257SSteve Yin     {
871*5fdc4257SSteve Yin         return E_FAIL;
872*5fdc4257SSteve Yin     }
873*5fdc4257SSteve Yin 
874*5fdc4257SSteve Yin     GetXInterface()->setSelection( startOffset,	endOffset );
875*5fdc4257SSteve Yin 
876*5fdc4257SSteve Yin     return S_OK;
877*5fdc4257SSteve Yin 
878*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
879*5fdc4257SSteve Yin }
880*5fdc4257SSteve Yin 
881*5fdc4257SSteve Yin /**
882*5fdc4257SSteve Yin    * Get characters count.
883*5fdc4257SSteve Yin    * @param nCharacters Variant to accept the characters count.
884*5fdc4257SSteve Yin    * @return Result.
885*5fdc4257SSteve Yin */
886*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_nCharacters(long * nCharacters)
887*5fdc4257SSteve Yin {
888*5fdc4257SSteve Yin 
889*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
890*5fdc4257SSteve Yin 
891*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
892*5fdc4257SSteve Yin 
893*5fdc4257SSteve Yin     if (nCharacters == NULL)
894*5fdc4257SSteve Yin         return E_INVALIDARG;
895*5fdc4257SSteve Yin     // #CHECK XInterface#
896*5fdc4257SSteve Yin     if(!pRXText.is())
897*5fdc4257SSteve Yin     {
898*5fdc4257SSteve Yin         *nCharacters = 0;
899*5fdc4257SSteve Yin         return S_OK;
900*5fdc4257SSteve Yin     }
901*5fdc4257SSteve Yin 
902*5fdc4257SSteve Yin     *nCharacters = GetXInterface()->getCharacterCount();
903*5fdc4257SSteve Yin 
904*5fdc4257SSteve Yin     return S_OK;
905*5fdc4257SSteve Yin 
906*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
907*5fdc4257SSteve Yin }
908*5fdc4257SSteve Yin 
909*5fdc4257SSteve Yin // added by qiuhd, 2006/07/03, for direver 07/11
910*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_newText( IA2TextSegment *)
911*5fdc4257SSteve Yin {
912*5fdc4257SSteve Yin     return E_NOTIMPL;
913*5fdc4257SSteve Yin }
914*5fdc4257SSteve Yin 
915*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_oldText( IA2TextSegment *)
916*5fdc4257SSteve Yin {
917*5fdc4257SSteve Yin     return E_NOTIMPL;
918*5fdc4257SSteve Yin }
919*5fdc4257SSteve Yin 
920*5fdc4257SSteve Yin /**
921*5fdc4257SSteve Yin    * Scroll to special sub-string .
922*5fdc4257SSteve Yin    * @param startIndex Start index of sub string.
923*5fdc4257SSteve Yin    * @param endIndex   End index of sub string.
924*5fdc4257SSteve Yin    * @return Result.
925*5fdc4257SSteve Yin */
926*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::scrollSubstringToPoint(long, long, IA2CoordinateType, long, long )
927*5fdc4257SSteve Yin {
928*5fdc4257SSteve Yin 
929*5fdc4257SSteve Yin 
930*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
931*5fdc4257SSteve Yin 
932*5fdc4257SSteve Yin     return E_NOTIMPL;
933*5fdc4257SSteve Yin 
934*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
935*5fdc4257SSteve Yin }
936*5fdc4257SSteve Yin 
937*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::scrollSubstringTo(long, long, IA2ScrollType)
938*5fdc4257SSteve Yin {
939*5fdc4257SSteve Yin 
940*5fdc4257SSteve Yin 
941*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
942*5fdc4257SSteve Yin 
943*5fdc4257SSteve Yin     return E_NOTIMPL;
944*5fdc4257SSteve Yin 
945*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
946*5fdc4257SSteve Yin }
947*5fdc4257SSteve Yin 
948*5fdc4257SSteve Yin /**
949*5fdc4257SSteve Yin    * Put UNO interface.
950*5fdc4257SSteve Yin    * @param pXInterface UNO interface.
951*5fdc4257SSteve Yin    * @return Result.
952*5fdc4257SSteve Yin */
953*5fdc4257SSteve Yin STDMETHODIMP CAccTextBase::put_XInterface(long pXInterface)
954*5fdc4257SSteve Yin {
955*5fdc4257SSteve Yin 
956*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
957*5fdc4257SSteve Yin 
958*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
959*5fdc4257SSteve Yin 
960*5fdc4257SSteve Yin     CUNOXWrapper::put_XInterface(pXInterface);
961*5fdc4257SSteve Yin     //special query.
962*5fdc4257SSteve Yin     if(pUNOInterface == NULL)
963*5fdc4257SSteve Yin         return E_FAIL;
964*5fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
965*5fdc4257SSteve Yin     if( !pRContext.is() )
966*5fdc4257SSteve Yin     {
967*5fdc4257SSteve Yin         return E_FAIL;
968*5fdc4257SSteve Yin     }
969*5fdc4257SSteve Yin     Reference<XAccessibleText> pRXI(pRContext,UNO_QUERY);
970*5fdc4257SSteve Yin     if( !pRXI.is() )
971*5fdc4257SSteve Yin         pRXText = NULL;
972*5fdc4257SSteve Yin     else
973*5fdc4257SSteve Yin         pRXText = pRXI;
974*5fdc4257SSteve Yin     return S_OK;
975*5fdc4257SSteve Yin 
976*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
977*5fdc4257SSteve Yin }
978*5fdc4257SSteve Yin 
979*5fdc4257SSteve Yin OUString ReplaceOneChar(OUString oldOUString, OUString replacedChar, OUString replaceStr)
980*5fdc4257SSteve Yin {
981*5fdc4257SSteve Yin     int iReplace = -1;
982*5fdc4257SSteve Yin     iReplace = oldOUString.lastIndexOf(replacedChar);
983*5fdc4257SSteve Yin     if (iReplace > -1)
984*5fdc4257SSteve Yin     {
985*5fdc4257SSteve Yin         for(;iReplace>-1;)
986*5fdc4257SSteve Yin         {
987*5fdc4257SSteve Yin             oldOUString = oldOUString.replaceAt(iReplace,1, replaceStr);
988*5fdc4257SSteve Yin             iReplace=oldOUString.lastIndexOf(replacedChar,iReplace);
989*5fdc4257SSteve Yin         }
990*5fdc4257SSteve Yin     }
991*5fdc4257SSteve Yin     return oldOUString;
992*5fdc4257SSteve Yin 
993*5fdc4257SSteve Yin }
994*5fdc4257SSteve Yin OUString ReplaceFourChar(OUString oldOUString)
995*5fdc4257SSteve Yin {
996*5fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii("\\"),OUString::createFromAscii("\\\\"));
997*5fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii(";"),OUString::createFromAscii("\\;"));
998*5fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii("="),OUString::createFromAscii("\\="));
999*5fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii(","),OUString::createFromAscii("\\,"));
1000*5fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii(":"),OUString::createFromAscii("\\:"));
1001*5fdc4257SSteve Yin     return oldOUString;
1002*5fdc4257SSteve Yin }
1003