1*3a700b0aSSteve Yin /**************************************************************
25fdc4257SSteve Yin  *
3*3a700b0aSSteve Yin  * Licensed to the Apache Software Foundation (ASF) under one
4*3a700b0aSSteve Yin  * or more contributor license agreements.  See the NOTICE file
5*3a700b0aSSteve Yin  * distributed with this work for additional information
6*3a700b0aSSteve Yin  * regarding copyright ownership.  The ASF licenses this file
7*3a700b0aSSteve Yin  * to you under the Apache License, Version 2.0 (the
8*3a700b0aSSteve Yin  * "License"); you may not use this file except in compliance
9*3a700b0aSSteve Yin  * with the License.  You may obtain a copy of the License at
10*3a700b0aSSteve Yin  *
11*3a700b0aSSteve Yin  *   http://www.apache.org/licenses/LICENSE-2.0
12*3a700b0aSSteve Yin  *
13*3a700b0aSSteve Yin  * Unless required by applicable law or agreed to in writing,
14*3a700b0aSSteve Yin  * software distributed under the License is distributed on an
15*3a700b0aSSteve Yin  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*3a700b0aSSteve Yin  * KIND, either express or implied.  See the License for the
17*3a700b0aSSteve Yin  * specific language governing permissions and limitations
18*3a700b0aSSteve Yin  * under the License.
19*3a700b0aSSteve Yin  *
20*3a700b0aSSteve Yin  *************************************************************/
215fdc4257SSteve Yin 
225fdc4257SSteve Yin //////////////////////////////////////////////////////////////////////
235fdc4257SSteve Yin // AccTextBase.cpp: implementation of the CAccTextBase class.
245fdc4257SSteve Yin //////////////////////////////////////////////////////////////////////
255fdc4257SSteve Yin #include "stdafx.h"
265fdc4257SSteve Yin #include <string>
275fdc4257SSteve Yin #define WNT
285fdc4257SSteve Yin 
295fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleTextType.hpp>
305fdc4257SSteve Yin #include "AccTextBase.h"
315fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp>
325fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleContext.hpp>
335fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleComponent.hpp>
345fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleTextSelection.hpp>
355fdc4257SSteve Yin #include "MAccessible.h"
365fdc4257SSteve Yin 
375fdc4257SSteve Yin using namespace com::sun::star::accessibility;
385fdc4257SSteve Yin using namespace com::sun::star::uno;
395fdc4257SSteve Yin using namespace rtl;
405fdc4257SSteve Yin 
415fdc4257SSteve Yin //////////////////////////////////////////////////////////////////////
425fdc4257SSteve Yin // Construction/Destruction
435fdc4257SSteve Yin //////////////////////////////////////////////////////////////////////
445fdc4257SSteve Yin 
455fdc4257SSteve Yin OUString ReplaceFourChar(OUString oldOUString);
465fdc4257SSteve Yin 
CAccTextBase()475fdc4257SSteve Yin CAccTextBase::CAccTextBase()
485fdc4257SSteve Yin {}
495fdc4257SSteve Yin 
~CAccTextBase()505fdc4257SSteve Yin CAccTextBase::~CAccTextBase()
515fdc4257SSteve Yin {}
525fdc4257SSteve Yin 
535fdc4257SSteve Yin 
545fdc4257SSteve Yin /**
555fdc4257SSteve Yin    * Get special selection.
565fdc4257SSteve Yin    * @param startOffset Start selection offset.
575fdc4257SSteve Yin    * @param endOffset   End selection offset.
585fdc4257SSteve Yin    * @param success     Variant to accept the result of if the method call is successful.
595fdc4257SSteve Yin    * @return Result.
605fdc4257SSteve Yin */
get_addSelection(long startOffset,long endOffset)615fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_addSelection(long startOffset, long endOffset)
625fdc4257SSteve Yin {
635fdc4257SSteve Yin 
645fdc4257SSteve Yin 	CHECK_ENABLE_INF
655fdc4257SSteve Yin 
665fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
675fdc4257SSteve Yin 
685fdc4257SSteve Yin     // #CHECK XInterface#
695fdc4257SSteve Yin     if(pUNOInterface == NULL)
705fdc4257SSteve Yin         return E_FAIL;
715fdc4257SSteve Yin 
725fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
735fdc4257SSteve Yin 
745fdc4257SSteve Yin     Reference< XAccessibleTextSelection > pRExtension(pRContext,UNO_QUERY);
755fdc4257SSteve Yin 
765fdc4257SSteve Yin     if( pRExtension.is() )
775fdc4257SSteve Yin     {
785fdc4257SSteve Yin         pRExtension->addSelection(0, startOffset, endOffset);
795fdc4257SSteve Yin         return S_OK;
805fdc4257SSteve Yin     }
815fdc4257SSteve Yin     else
825fdc4257SSteve Yin     {
835fdc4257SSteve Yin         GetXInterface()->setSelection(startOffset, endOffset);
845fdc4257SSteve Yin         return S_OK;
855fdc4257SSteve Yin     }
865fdc4257SSteve Yin 
875fdc4257SSteve Yin     return E_FAIL;
885fdc4257SSteve Yin 
895fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
905fdc4257SSteve Yin }
915fdc4257SSteve Yin 
925fdc4257SSteve Yin /**
935fdc4257SSteve Yin    * Get special attributes.
945fdc4257SSteve Yin    * @param offset Offset.
955fdc4257SSteve Yin    * @param startOffset Variant to accept start offset.
965fdc4257SSteve Yin    * @param endOffset   Variant to accept end offset.
975fdc4257SSteve Yin    * @param textAttributes     Variant to accept attributes.
985fdc4257SSteve Yin    * @return Result.
995fdc4257SSteve Yin */
get_attributes(long offset,long * startOffset,long * endOffset,BSTR * textAttributes)1005fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_attributes(long offset, long * startOffset, long * endOffset, BSTR * textAttributes)
1015fdc4257SSteve Yin {
1025fdc4257SSteve Yin 
1035fdc4257SSteve Yin 	CHECK_ENABLE_INF
1045fdc4257SSteve Yin 
1055fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
1065fdc4257SSteve Yin 
1075fdc4257SSteve Yin     if (startOffset == NULL || endOffset == NULL || textAttributes == NULL)
1085fdc4257SSteve Yin         return E_INVALIDARG;
1095fdc4257SSteve Yin     // #CHECK XInterface#
1105fdc4257SSteve Yin     if(!pRXText.is())
1115fdc4257SSteve Yin     {
1125fdc4257SSteve Yin         return E_FAIL;
1135fdc4257SSteve Yin     }
1145fdc4257SSteve Yin 
1155fdc4257SSteve Yin     if( offset < 0 || offset > GetXInterface()->getCharacterCount() )
1165fdc4257SSteve Yin         return E_FAIL;
1175fdc4257SSteve Yin 
1185fdc4257SSteve Yin 	std::wstring strAttrs;
1195fdc4257SSteve Yin 
1205fdc4257SSteve Yin     strAttrs += L"Version:1;";
1215fdc4257SSteve Yin 
1225fdc4257SSteve Yin     Sequence< ::com::sun::star::beans::PropertyValue > pValues = GetXInterface()->getCharacterAttributes(offset, Sequence< rtl::OUString >());
1235fdc4257SSteve Yin     int nCount = pValues.getLength();
1245fdc4257SSteve Yin 
1255fdc4257SSteve Yin     short numberingLevel = 0;
1265fdc4257SSteve Yin     OUString numberingPrefix;
1275fdc4257SSteve Yin 	Any anyNumRule;
1285fdc4257SSteve Yin     bool bHaveNumberingPrefixAttr = false;
1295fdc4257SSteve Yin 	bool bHaveNumberingLevel = false;
1305fdc4257SSteve Yin 	bool bHaveNumberingRules = false;
1315fdc4257SSteve Yin     for(int i =0; i<nCount; i++)
1325fdc4257SSteve Yin     {
1335fdc4257SSteve Yin 
1345fdc4257SSteve Yin         ::com::sun::star::beans::PropertyValue &pValue = pValues[i];
1355fdc4257SSteve Yin         if(pValue.Name.compareTo(OUString::createFromAscii("NumberingLevel"))==0)
1365fdc4257SSteve Yin         {
1375fdc4257SSteve Yin 			if (pValue.Value != Any())
1385fdc4257SSteve Yin 				pValue.Value >>= numberingLevel;
1395fdc4257SSteve Yin 			else
1405fdc4257SSteve Yin 				numberingLevel = -1;
1415fdc4257SSteve Yin 			bHaveNumberingLevel = true;
1425fdc4257SSteve Yin             continue;
1435fdc4257SSteve Yin         }
1445fdc4257SSteve Yin         if(pValue.Name.compareTo(OUString::createFromAscii("NumberingPrefix"))==0)
1455fdc4257SSteve Yin         {
1465fdc4257SSteve Yin             pValue.Value >>=numberingPrefix;
1475fdc4257SSteve Yin             bHaveNumberingPrefixAttr = true;
1485fdc4257SSteve Yin             continue;
1495fdc4257SSteve Yin         }
1505fdc4257SSteve Yin         if(pValue.Name.compareTo(OUString::createFromAscii("NumberingRules"))==0)
1515fdc4257SSteve Yin         {
1525fdc4257SSteve Yin 			bHaveNumberingRules = true;
1535fdc4257SSteve Yin 			anyNumRule = pValue.Value;
1545fdc4257SSteve Yin 			continue;
1555fdc4257SSteve Yin         }
1565fdc4257SSteve Yin 		if (bHaveNumberingLevel && bHaveNumberingRules && bHaveNumberingPrefixAttr)
1575fdc4257SSteve Yin 		{
1585fdc4257SSteve Yin 			OLECHAR numProps[512] = {0};
1595fdc4257SSteve Yin 			strAttrs+=L";";
1605fdc4257SSteve Yin 			numberingPrefix = ReplaceFourChar(numberingPrefix);
1615fdc4257SSteve Yin 			CMAccessible::get_OLECHAR4Numbering(anyNumRule,numberingLevel,numberingPrefix,numProps);
1625fdc4257SSteve Yin 			strAttrs += numProps;
1635fdc4257SSteve Yin 			bHaveNumberingLevel = 0;
1645fdc4257SSteve Yin 			bHaveNumberingRules = 0;
1655fdc4257SSteve Yin 		}
1665fdc4257SSteve Yin 		if( (bHaveNumberingPrefixAttr && i > 1 ) ||
1675fdc4257SSteve Yin 			(!bHaveNumberingPrefixAttr && i > 0 ) ) //element 0 is NumberingPrefix, not write alone
1685fdc4257SSteve Yin 		{
1695fdc4257SSteve Yin 			strAttrs+=L";";
1705fdc4257SSteve Yin 		}
1715fdc4257SSteve Yin         strAttrs += pValue.Name.getStr();
1725fdc4257SSteve Yin         strAttrs += L":";
1735fdc4257SSteve Yin 
1745fdc4257SSteve Yin         OLECHAR pTemp[2048] = {0};
1755fdc4257SSteve Yin 
1765fdc4257SSteve Yin         if (pValue.Name.compareTo(OUString::createFromAscii("CharBackColor"))==0 ||
1775fdc4257SSteve Yin                 pValue.Name.compareTo(OUString::createFromAscii("CharColor"))==0 ||
1785fdc4257SSteve Yin                 pValue.Name.compareTo(OUString::createFromAscii("CharUnderlineColor"))==0 )
1795fdc4257SSteve Yin         {
1805fdc4257SSteve Yin             unsigned long nColor;
1815fdc4257SSteve Yin             pValue.Value >>= nColor;
1825fdc4257SSteve Yin             OLECHAR pBuf[64];
1835fdc4257SSteve Yin             swprintf( pBuf, L"%08X", nColor );
1845fdc4257SSteve Yin             pTemp[0]=L'#';
1855fdc4257SSteve Yin             wcscat( pTemp, pBuf );
1865fdc4257SSteve Yin 
1875fdc4257SSteve Yin         }
1885fdc4257SSteve Yin         else
1895fdc4257SSteve Yin         {
1905fdc4257SSteve Yin             CMAccessible::get_OLECHARFromAny(pValue.Value,pTemp);
1915fdc4257SSteve Yin         }
1925fdc4257SSteve Yin 
1935fdc4257SSteve Yin         strAttrs +=pTemp;
1945fdc4257SSteve Yin     }
1955fdc4257SSteve Yin 	strAttrs +=L";";
1965fdc4257SSteve Yin     // #CHECK#
1975fdc4257SSteve Yin     if(*textAttributes)
1985fdc4257SSteve Yin         SysFreeString(*textAttributes);
1995fdc4257SSteve Yin     *textAttributes = SysAllocString(strAttrs.c_str());
2005fdc4257SSteve Yin 
2015fdc4257SSteve Yin     if( offset < GetXInterface()->getCharacterCount() )
2025fdc4257SSteve Yin     {
2035fdc4257SSteve Yin         TextSegment textSeg = GetXInterface()->getTextAtIndex(offset, AccessibleTextType::ATTRIBUTE_RUN);
2045fdc4257SSteve Yin         *startOffset = textSeg.SegmentStart;
2055fdc4257SSteve Yin         *endOffset = textSeg.SegmentEnd;
2065fdc4257SSteve Yin     }
2075fdc4257SSteve Yin     else
2085fdc4257SSteve Yin     {
2095fdc4257SSteve Yin         *startOffset = offset;
2105fdc4257SSteve Yin         *endOffset = offset;
2115fdc4257SSteve Yin     }
2125fdc4257SSteve Yin 
2135fdc4257SSteve Yin     return S_OK;
2145fdc4257SSteve Yin 
2155fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
2165fdc4257SSteve Yin }
2175fdc4257SSteve Yin 
2185fdc4257SSteve Yin /**
2195fdc4257SSteve Yin    * Get caret position.
2205fdc4257SSteve Yin    * @param offset     Variant to accept caret offset.
2215fdc4257SSteve Yin    * @return Result.
2225fdc4257SSteve Yin */
get_caretOffset(long * offset)2235fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_caretOffset(long * offset)
2245fdc4257SSteve Yin {
2255fdc4257SSteve Yin 
2265fdc4257SSteve Yin 	CHECK_ENABLE_INF
2275fdc4257SSteve Yin 
2285fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
2295fdc4257SSteve Yin 
2305fdc4257SSteve Yin     if (offset == NULL)
2315fdc4257SSteve Yin         return E_INVALIDARG;
2325fdc4257SSteve Yin     // #CHECK XInterface#
2335fdc4257SSteve Yin     if(!pRXText.is())
2345fdc4257SSteve Yin     {
2355fdc4257SSteve Yin         *offset = 0;
2365fdc4257SSteve Yin         return S_OK;
2375fdc4257SSteve Yin     }
2385fdc4257SSteve Yin 
2395fdc4257SSteve Yin     *offset = GetXInterface()->getCaretPosition();
2405fdc4257SSteve Yin     return S_OK;
2415fdc4257SSteve Yin 
2425fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
2435fdc4257SSteve Yin }
2445fdc4257SSteve Yin 
2455fdc4257SSteve Yin /**
2465fdc4257SSteve Yin    * Get character count.
2475fdc4257SSteve Yin    * @param nCharacters  Variant to accept character count.
2485fdc4257SSteve Yin    * @return Result.
2495fdc4257SSteve Yin */
get_characterCount(long * nCharacters)2505fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_characterCount(long * nCharacters)
2515fdc4257SSteve Yin {
2525fdc4257SSteve Yin 
2535fdc4257SSteve Yin 	CHECK_ENABLE_INF
2545fdc4257SSteve Yin 
2555fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
2565fdc4257SSteve Yin 
2575fdc4257SSteve Yin     if (nCharacters == NULL)
2585fdc4257SSteve Yin         return E_INVALIDARG;
2595fdc4257SSteve Yin     // #CHECK XInterface#
2605fdc4257SSteve Yin     if(!pRXText.is())
2615fdc4257SSteve Yin     {
2625fdc4257SSteve Yin         *nCharacters = 0;
2635fdc4257SSteve Yin         return S_OK;
2645fdc4257SSteve Yin     }
2655fdc4257SSteve Yin 
2665fdc4257SSteve Yin     *nCharacters = GetXInterface()->getCharacterCount();
2675fdc4257SSteve Yin     return S_OK;
2685fdc4257SSteve Yin 
2695fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
2705fdc4257SSteve Yin }
2715fdc4257SSteve Yin 
2725fdc4257SSteve Yin /**
2735fdc4257SSteve Yin    * Get character extents.
2745fdc4257SSteve Yin    * @param offset  Offset.
2755fdc4257SSteve Yin    * @param x Variant to accept x position.
2765fdc4257SSteve Yin    * @param y Variant to accept y position.
2775fdc4257SSteve Yin    * @param width Variant to accept width.
2785fdc4257SSteve Yin    * @param Height Variant to accept height.
2795fdc4257SSteve Yin    * @return Result.
2805fdc4257SSteve Yin */
get_characterExtents(long offset,IA2CoordinateType coordType,long * x,long * y,long * width,long * height)2815fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_characterExtents(long offset, IA2CoordinateType coordType, long * x, long * y, long * width, long * height)
2825fdc4257SSteve Yin {
2835fdc4257SSteve Yin 
2845fdc4257SSteve Yin 	CHECK_ENABLE_INF
2855fdc4257SSteve Yin 
2865fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
2875fdc4257SSteve Yin 
2885fdc4257SSteve Yin     if (x == NULL || height == NULL || y == NULL || width == NULL)
2895fdc4257SSteve Yin         return E_INVALIDARG;
2905fdc4257SSteve Yin     // #CHECK XInterface#
2915fdc4257SSteve Yin     if(!pRXText.is())
2925fdc4257SSteve Yin         return E_FAIL;
2935fdc4257SSteve Yin 
2945fdc4257SSteve Yin     if(offset < 0 || offset > GetXInterface()->getCharacterCount() )
2955fdc4257SSteve Yin         return E_FAIL;
2965fdc4257SSteve Yin 
2975fdc4257SSteve Yin     com::sun::star::awt::Rectangle rectangle;
2985fdc4257SSteve Yin     rectangle = GetXInterface()->getCharacterBounds(offset);
2995fdc4257SSteve Yin 
3005fdc4257SSteve Yin     //IA2Point aPoint;
3015fdc4257SSteve Yin     com::sun::star::awt::Point aPoint;
3025fdc4257SSteve Yin 
3035fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
3045fdc4257SSteve Yin     if( !pRContext.is() )
3055fdc4257SSteve Yin     {
3065fdc4257SSteve Yin         return E_FAIL;
3075fdc4257SSteve Yin     }
3085fdc4257SSteve Yin     Reference<XAccessibleComponent> pRComp(pRContext,UNO_QUERY);
3095fdc4257SSteve Yin     if( pRComp.is() )
3105fdc4257SSteve Yin     {
3115fdc4257SSteve Yin         if(coordType == IA2_COORDTYPE_SCREEN_RELATIVE)
3125fdc4257SSteve Yin         {
3135fdc4257SSteve Yin             ::com::sun::star::awt::Point pt = pRComp->getLocationOnScreen();
3145fdc4257SSteve Yin             aPoint.X = pt.X;
3155fdc4257SSteve Yin             aPoint.Y = pt.Y;
3165fdc4257SSteve Yin         }
3175fdc4257SSteve Yin         else if(coordType == IA2_COORDTYPE_PARENT_RELATIVE)
3185fdc4257SSteve Yin         {
3195fdc4257SSteve Yin             ::com::sun::star::awt::Point pt = pRComp->getLocation();
3205fdc4257SSteve Yin             aPoint.X = pt.X;
3215fdc4257SSteve Yin             aPoint.Y = pt.Y;
3225fdc4257SSteve Yin         }
3235fdc4257SSteve Yin     }
3245fdc4257SSteve Yin     rectangle.X = rectangle.X + aPoint.X;
3255fdc4257SSteve Yin     rectangle.Y = rectangle.Y + aPoint.Y;
3265fdc4257SSteve Yin 
3275fdc4257SSteve Yin     *x = rectangle.X;
3285fdc4257SSteve Yin     *y = rectangle.Y;
3295fdc4257SSteve Yin 
3305fdc4257SSteve Yin     // GetXInterface()->getCharacterBounds() have different implement in different acc component
3315fdc4257SSteve Yin     // But we need return the width/height == 1 for every component when offset == text length.
3325fdc4257SSteve Yin     // So we ignore the return result of GetXInterface()->getCharacterBounds() when offset == text length.
3335fdc4257SSteve Yin     if( offset == GetXInterface()->getCharacterCount() )
3345fdc4257SSteve Yin     {
3355fdc4257SSteve Yin         *width = 1;
3365fdc4257SSteve Yin         *height = 1;
3375fdc4257SSteve Yin     }
3385fdc4257SSteve Yin     else
3395fdc4257SSteve Yin     {
3405fdc4257SSteve Yin         *width = rectangle.Width;
3415fdc4257SSteve Yin         *height = rectangle.Height;
3425fdc4257SSteve Yin     }
3435fdc4257SSteve Yin 
3445fdc4257SSteve Yin     return S_OK;
3455fdc4257SSteve Yin 
3465fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
3475fdc4257SSteve Yin }
3485fdc4257SSteve Yin 
3495fdc4257SSteve Yin /**
3505fdc4257SSteve Yin    * Get selections count.
3515fdc4257SSteve Yin    * @param nSelections Variant to accept selections count.
3525fdc4257SSteve Yin    * @return Result.
3535fdc4257SSteve Yin */
get_nSelections(long * nSelections)3545fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_nSelections(long * nSelections)
3555fdc4257SSteve Yin {
3565fdc4257SSteve Yin 
3575fdc4257SSteve Yin 	CHECK_ENABLE_INF
3585fdc4257SSteve Yin 
3595fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
3605fdc4257SSteve Yin 
3615fdc4257SSteve Yin     if (nSelections == NULL)
3625fdc4257SSteve Yin         return E_INVALIDARG;
3635fdc4257SSteve Yin     // #CHECK XInterface#
3645fdc4257SSteve Yin     if(pUNOInterface == NULL)
3655fdc4257SSteve Yin     {
3665fdc4257SSteve Yin         *nSelections = 0;
3675fdc4257SSteve Yin         return S_OK;
3685fdc4257SSteve Yin     }
3695fdc4257SSteve Yin 
3705fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
3715fdc4257SSteve Yin 
3725fdc4257SSteve Yin     Reference< XAccessibleTextSelection > pRExtension(pRContext,UNO_QUERY);
3735fdc4257SSteve Yin 
3745fdc4257SSteve Yin     if( pRExtension.is() )
3755fdc4257SSteve Yin     {
3765fdc4257SSteve Yin         *nSelections = pRExtension->getSelectedPortionCount();
3775fdc4257SSteve Yin         return S_OK;
3785fdc4257SSteve Yin     }
3795fdc4257SSteve Yin 
3805fdc4257SSteve Yin     long iLength = GetXInterface()->getSelectedText().getLength();
3815fdc4257SSteve Yin     if( iLength> 0)
3825fdc4257SSteve Yin     {
3835fdc4257SSteve Yin         *nSelections = 1;
3845fdc4257SSteve Yin         return S_OK;
3855fdc4257SSteve Yin     }
3865fdc4257SSteve Yin 
3875fdc4257SSteve Yin     *nSelections = 0;
3885fdc4257SSteve Yin     return S_OK;
3895fdc4257SSteve Yin 
3905fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
3915fdc4257SSteve Yin }
3925fdc4257SSteve Yin 
3935fdc4257SSteve Yin /**
3945fdc4257SSteve Yin    * Get offset of some special point.
3955fdc4257SSteve Yin    * @param x X position of one point.
3965fdc4257SSteve Yin    * @param x Y position of one point.
3975fdc4257SSteve Yin    * @param coordType Type.
3985fdc4257SSteve Yin    * @param offset Variant to accept offset.
3995fdc4257SSteve Yin    * @return Result.
4005fdc4257SSteve Yin */
get_offsetAtPoint(long x,long y,IA2CoordinateType,long * offset)4015fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_offsetAtPoint(long x, long y, IA2CoordinateType, long * offset)
4025fdc4257SSteve Yin {
4035fdc4257SSteve Yin 	CHECK_ENABLE_INF
4045fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
4055fdc4257SSteve Yin 
4065fdc4257SSteve Yin     if (offset == NULL)
4075fdc4257SSteve Yin         return E_INVALIDARG;
4085fdc4257SSteve Yin     // #CHECK XInterface#
4095fdc4257SSteve Yin     if(!pRXText.is())
4105fdc4257SSteve Yin         return E_FAIL;
4115fdc4257SSteve Yin 
4125fdc4257SSteve Yin     com::sun::star::awt::Point point;
4135fdc4257SSteve Yin     point.X = x;
4145fdc4257SSteve Yin     point.Y = y;
4155fdc4257SSteve Yin     *offset = GetXInterface()->getIndexAtPoint(point);
4165fdc4257SSteve Yin     return S_OK;
4175fdc4257SSteve Yin 
4185fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
4195fdc4257SSteve Yin }
4205fdc4257SSteve Yin 
4215fdc4257SSteve Yin /**
4225fdc4257SSteve Yin    * Get selection range.
4235fdc4257SSteve Yin    * @param selection selection count.
4245fdc4257SSteve Yin    * @param startOffset Variant to accept the start offset of special selection.
4255fdc4257SSteve Yin    * @param endOffset Variant to accept the end offset of special selection.
4265fdc4257SSteve Yin    * @return Result.
4275fdc4257SSteve Yin */
4285fdc4257SSteve Yin 
get_selection(long selectionIndex,long * startOffset,long * endOffset)4295fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_selection(long selectionIndex, long * startOffset, long * endOffset)
4305fdc4257SSteve Yin {
4315fdc4257SSteve Yin 
4325fdc4257SSteve Yin 	CHECK_ENABLE_INF
4335fdc4257SSteve Yin 
4345fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
4355fdc4257SSteve Yin 
4365fdc4257SSteve Yin     if (startOffset == NULL || endOffset == NULL )
4375fdc4257SSteve Yin         return E_INVALIDARG;
4385fdc4257SSteve Yin     // #CHECK XInterface#
4395fdc4257SSteve Yin     if(pUNOInterface == NULL )
4405fdc4257SSteve Yin         return E_FAIL;
4415fdc4257SSteve Yin 
4425fdc4257SSteve Yin     long nSelection = 0;
4435fdc4257SSteve Yin     get_nSelections(&nSelection);
4445fdc4257SSteve Yin 
4455fdc4257SSteve Yin     if(selectionIndex >= nSelection || selectionIndex < 0 )
4465fdc4257SSteve Yin         return E_FAIL;
4475fdc4257SSteve Yin 
4485fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
4495fdc4257SSteve Yin 
4505fdc4257SSteve Yin     Reference< XAccessibleTextSelection > pRExtension(pRContext,UNO_QUERY);
4515fdc4257SSteve Yin 
4525fdc4257SSteve Yin     if( pRExtension.is() )
4535fdc4257SSteve Yin     {
4545fdc4257SSteve Yin         *startOffset = pRExtension->getSeletedPositionStart(selectionIndex);
4555fdc4257SSteve Yin         *endOffset = pRExtension->getSeletedPositionEnd(selectionIndex);
4565fdc4257SSteve Yin         return S_OK;
4575fdc4257SSteve Yin     }
4585fdc4257SSteve Yin     else if(GetXInterface()->getSelectionEnd() > -1)
4595fdc4257SSteve Yin     {
4605fdc4257SSteve Yin         *startOffset = GetXInterface()->getSelectionStart();
4615fdc4257SSteve Yin         *endOffset = GetXInterface()->getSelectionEnd();
4625fdc4257SSteve Yin         return S_OK;
4635fdc4257SSteve Yin     }
4645fdc4257SSteve Yin 
4655fdc4257SSteve Yin     *startOffset = 0;
4665fdc4257SSteve Yin     *endOffset = 0;
4675fdc4257SSteve Yin     return E_FAIL;
4685fdc4257SSteve Yin 
4695fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
4705fdc4257SSteve Yin }
4715fdc4257SSteve Yin 
4725fdc4257SSteve Yin /**
4735fdc4257SSteve Yin    * Get special text.
4745fdc4257SSteve Yin    * @param startOffset Start position of special range.
4755fdc4257SSteve Yin    * @param endOffset   End position of special range.
4765fdc4257SSteve Yin    * @param text        Variant to accept the text of special range.
4775fdc4257SSteve Yin    * @return Result.
4785fdc4257SSteve Yin */
get_text(long startOffset,long endOffset,BSTR * text)4795fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_text(long startOffset, long endOffset, BSTR * text)
4805fdc4257SSteve Yin {
4815fdc4257SSteve Yin 
4825fdc4257SSteve Yin 	CHECK_ENABLE_INF
4835fdc4257SSteve Yin 
4845fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
4855fdc4257SSteve Yin 
4865fdc4257SSteve Yin     if (text == NULL)
4875fdc4257SSteve Yin         return E_INVALIDARG;
4885fdc4257SSteve Yin     // #CHECK XInterface#
4895fdc4257SSteve Yin     if(!pRXText.is())
4905fdc4257SSteve Yin         return E_FAIL;
4915fdc4257SSteve Yin 
4925fdc4257SSteve Yin     if (endOffset < -1 || endOffset < startOffset )
4935fdc4257SSteve Yin     {
4945fdc4257SSteve Yin         return E_FAIL;
4955fdc4257SSteve Yin     }
4965fdc4257SSteve Yin 
4975fdc4257SSteve Yin     ::rtl::OUString ouStr;
4985fdc4257SSteve Yin     if (endOffset == -1 )
4995fdc4257SSteve Yin     {
5005fdc4257SSteve Yin         long nLen=0;
5015fdc4257SSteve Yin         if(SUCCEEDED(get_characterCount(&nLen)))
5025fdc4257SSteve Yin         {
5035fdc4257SSteve Yin             ouStr = GetXInterface()->getTextRange( 0, nLen );
5045fdc4257SSteve Yin         }
5055fdc4257SSteve Yin     }
5065fdc4257SSteve Yin     else
5075fdc4257SSteve Yin     {
5085fdc4257SSteve Yin         ouStr = GetXInterface()->getTextRange( startOffset, endOffset );
5095fdc4257SSteve Yin     }
5105fdc4257SSteve Yin 
5115fdc4257SSteve Yin     SysFreeString(*text);
5125fdc4257SSteve Yin     *text = SysAllocString((OLECHAR*)ouStr.getStr());
5135fdc4257SSteve Yin     return S_OK;
5145fdc4257SSteve Yin 
5155fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
5165fdc4257SSteve Yin }
5175fdc4257SSteve Yin 
5185fdc4257SSteve Yin /**
5195fdc4257SSteve Yin    * Get special text before some position.
5205fdc4257SSteve Yin    * @param offset Special position.
5215fdc4257SSteve Yin    * @param boundaryType Boundary type.
5225fdc4257SSteve Yin    * @param startOffset Variant to accept the start offset.
5235fdc4257SSteve Yin    * @param endOffset   Variant to accept the end offset.
5245fdc4257SSteve Yin    * @param text        Variant to accept the special text.
5255fdc4257SSteve Yin    * @return Result.
5265fdc4257SSteve Yin */
get_textBeforeOffset(long offset,IA2TextBoundaryType boundaryType,long * startOffset,long * endOffset,BSTR * text)5275fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_textBeforeOffset(long offset, IA2TextBoundaryType boundaryType, long * startOffset, long * endOffset, BSTR * text)
5285fdc4257SSteve Yin {
5295fdc4257SSteve Yin 
5305fdc4257SSteve Yin 	CHECK_ENABLE_INF
5315fdc4257SSteve Yin 
5325fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
5335fdc4257SSteve Yin 
5345fdc4257SSteve Yin     // #CHECK#
5355fdc4257SSteve Yin     if (startOffset == NULL || endOffset == NULL || text == NULL)
5365fdc4257SSteve Yin         return E_INVALIDARG;
5375fdc4257SSteve Yin     // #CHECK XInterface#
5385fdc4257SSteve Yin     if(!pRXText.is())
5395fdc4257SSteve Yin         return E_FAIL;
5405fdc4257SSteve Yin 
5415fdc4257SSteve Yin     // In New UNO IAccessibleText.idl these constant values are defined as follows:
5425fdc4257SSteve Yin     //
5435fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_CHAR = -1;
5445fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_TO_CURSOR_POS = -2;
5455fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_WORD = -3;
5465fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_WORD = -4;
5475fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_SENTENCE = -5;
5485fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_SENTENCE = -6;
5495fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_LINE = -7;
5505fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_LINE = -8;
5515fdc4257SSteve Yin     //
5525fdc4257SSteve Yin     // In UNO, the corresponding values are as follows:
5535fdc4257SSteve Yin     //
5545fdc4257SSteve Yin     //  const short CHARACTER = 1;
5555fdc4257SSteve Yin     //  const short WORD = 2;
5565fdc4257SSteve Yin     //  const short SENTENCE = 3;
5575fdc4257SSteve Yin     //  const short PARAGRAPH = 4;
5585fdc4257SSteve Yin     //  const short LINE = 5;
5595fdc4257SSteve Yin     //  const short GLYPH = 6;
5605fdc4257SSteve Yin     //  const short ATTRIBUTE_RUN = 7;
5615fdc4257SSteve Yin     //
5625fdc4257SSteve Yin 
5635fdc4257SSteve Yin     long			lUnoBoundaryType;
5645fdc4257SSteve Yin 
5655fdc4257SSteve Yin     switch(boundaryType)
5665fdc4257SSteve Yin     {
5675fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_CHAR:
5685fdc4257SSteve Yin         lUnoBoundaryType = 1; // CHARACTER;
5695fdc4257SSteve Yin         break;
5705fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_WORD:
5715fdc4257SSteve Yin         lUnoBoundaryType = 2; // WORD;
5725fdc4257SSteve Yin         break;
5735fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_SENTENCE:
5745fdc4257SSteve Yin         lUnoBoundaryType = 3; // SENTENCE;
5755fdc4257SSteve Yin         break;
5765fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_LINE:
5775fdc4257SSteve Yin         lUnoBoundaryType = 5; // LINE;
5785fdc4257SSteve Yin         break;
5795fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_PARAGRAPH:
5805fdc4257SSteve Yin         lUnoBoundaryType = 4;
5815fdc4257SSteve Yin         break;
5825fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_ALL:
5835fdc4257SSteve Yin         {
5845fdc4257SSteve Yin             long nChar;
5855fdc4257SSteve Yin             get_nCharacters( &nChar );
5865fdc4257SSteve Yin             *startOffset = 0;
5875fdc4257SSteve Yin             *endOffset = nChar;
5885fdc4257SSteve Yin             return get_text(0, nChar, text);
5895fdc4257SSteve Yin         }
5905fdc4257SSteve Yin         break;
5915fdc4257SSteve Yin     default:
5925fdc4257SSteve Yin         return E_FAIL;
5935fdc4257SSteve Yin     }
5945fdc4257SSteve Yin 
5955fdc4257SSteve Yin     TextSegment segment = GetXInterface()->getTextBeforeIndex( offset, sal_Int16(lUnoBoundaryType));
5965fdc4257SSteve Yin     ::rtl::OUString ouStr = segment.SegmentText;
5975fdc4257SSteve Yin     SysFreeString(*text);
5985fdc4257SSteve Yin     *text = SysAllocString((OLECHAR*)ouStr.getStr());
5995fdc4257SSteve Yin     *startOffset = segment.SegmentStart;
6005fdc4257SSteve Yin     *endOffset = segment.SegmentEnd;
6015fdc4257SSteve Yin 
6025fdc4257SSteve Yin     return S_OK;
6035fdc4257SSteve Yin 
6045fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
6055fdc4257SSteve Yin }
6065fdc4257SSteve Yin 
6075fdc4257SSteve Yin /**
6085fdc4257SSteve Yin    * Get special text after some position.
6095fdc4257SSteve Yin    * @param offset Special position.
6105fdc4257SSteve Yin    * @param boundaryType Boundary type.
6115fdc4257SSteve Yin    * @param startOffset Variant to accept the start offset.
6125fdc4257SSteve Yin    * @param endOffset   Variant to accept the end offset.
6135fdc4257SSteve Yin    * @param text        Variant to accept the special text.
6145fdc4257SSteve Yin    * @return Result.
6155fdc4257SSteve Yin */
get_textAfterOffset(long offset,IA2TextBoundaryType boundaryType,long * startOffset,long * endOffset,BSTR * text)6165fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_textAfterOffset(long offset, IA2TextBoundaryType boundaryType, long * startOffset, long * endOffset, BSTR * text)
6175fdc4257SSteve Yin {
6185fdc4257SSteve Yin 
6195fdc4257SSteve Yin 	CHECK_ENABLE_INF
6205fdc4257SSteve Yin 
6215fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
6225fdc4257SSteve Yin 
6235fdc4257SSteve Yin     if (startOffset == NULL || endOffset == NULL || text == NULL)
6245fdc4257SSteve Yin         return E_INVALIDARG;
6255fdc4257SSteve Yin     // #CHECK XInterface#
6265fdc4257SSteve Yin     if(!pRXText.is())
6275fdc4257SSteve Yin         return E_FAIL;
6285fdc4257SSteve Yin 
6295fdc4257SSteve Yin     // In New UNO IAccessibleText.idl these constant values are defined as follows:
6305fdc4257SSteve Yin     //
6315fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_CHAR = -1;
6325fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_TO_CURSOR_POS = -2;
6335fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_WORD = -3;
6345fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_WORD = -4;
6355fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_SENTENCE = -5;
6365fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_SENTENCE = -6;
6375fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_LINE = -7;
6385fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_LINE = -8;
6395fdc4257SSteve Yin     //
6405fdc4257SSteve Yin     // In UNO, the corresponding values are as follows:
6415fdc4257SSteve Yin     //
6425fdc4257SSteve Yin     //  const short CHARACTER = 1;
6435fdc4257SSteve Yin     //  const short WORD = 2;
6445fdc4257SSteve Yin     //  const short SENTENCE = 3;
6455fdc4257SSteve Yin     //  const short PARAGRAPH = 4;
6465fdc4257SSteve Yin     //  const short LINE = 5;
6475fdc4257SSteve Yin     //  const short GLYPH = 6;
6485fdc4257SSteve Yin     //  const short ATTRIBUTE_RUN = 7;
6495fdc4257SSteve Yin     //
6505fdc4257SSteve Yin 
6515fdc4257SSteve Yin     long			lUnoBoundaryType;
6525fdc4257SSteve Yin     switch(boundaryType)
6535fdc4257SSteve Yin     {
6545fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_CHAR:
6555fdc4257SSteve Yin         lUnoBoundaryType = 1; // CHARACTER;
6565fdc4257SSteve Yin         break;
6575fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_WORD:
6585fdc4257SSteve Yin         lUnoBoundaryType = 2; // WORD;
6595fdc4257SSteve Yin         break;
6605fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_SENTENCE:
6615fdc4257SSteve Yin         lUnoBoundaryType = 3; // SENTENCE;
6625fdc4257SSteve Yin         break;
6635fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_LINE:
6645fdc4257SSteve Yin         lUnoBoundaryType = 5; // LINE;
6655fdc4257SSteve Yin         break;
6665fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_PARAGRAPH:
6675fdc4257SSteve Yin         lUnoBoundaryType = 4;
6685fdc4257SSteve Yin         break;
6695fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_ALL:
6705fdc4257SSteve Yin         {
6715fdc4257SSteve Yin             long nChar;
6725fdc4257SSteve Yin             get_nCharacters( &nChar );
6735fdc4257SSteve Yin             *startOffset = 0;
6745fdc4257SSteve Yin             *endOffset = nChar;
6755fdc4257SSteve Yin             return get_text(0, nChar, text);
6765fdc4257SSteve Yin         }
6775fdc4257SSteve Yin         break;
6785fdc4257SSteve Yin     default:
6795fdc4257SSteve Yin         return E_FAIL;
6805fdc4257SSteve Yin     }
6815fdc4257SSteve Yin 
6825fdc4257SSteve Yin     TextSegment segment = GetXInterface()->getTextBehindIndex( offset, sal_Int16(lUnoBoundaryType));
6835fdc4257SSteve Yin     ::rtl::OUString ouStr = segment.SegmentText;
6845fdc4257SSteve Yin     SysFreeString(*text);
6855fdc4257SSteve Yin     *text = SysAllocString((OLECHAR*)ouStr.getStr());
6865fdc4257SSteve Yin     *startOffset = segment.SegmentStart;
6875fdc4257SSteve Yin     *endOffset = segment.SegmentEnd;
6885fdc4257SSteve Yin 
6895fdc4257SSteve Yin     return S_OK;
6905fdc4257SSteve Yin 
6915fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
6925fdc4257SSteve Yin }
6935fdc4257SSteve Yin 
6945fdc4257SSteve Yin /**
6955fdc4257SSteve Yin    * Get special text at some position.
6965fdc4257SSteve Yin    * @param offset Special position.
6975fdc4257SSteve Yin    * @param boundaryType Boundary type.
6985fdc4257SSteve Yin    * @param startOffset Variant to accept the start offset.
6995fdc4257SSteve Yin    * @param endOffset   Variant to accept the end offset.
7005fdc4257SSteve Yin    * @param text        Variant to accept the special text.
7015fdc4257SSteve Yin    * @return Result.
7025fdc4257SSteve Yin */
get_textAtOffset(long offset,IA2TextBoundaryType boundaryType,long * startOffset,long * endOffset,BSTR * text)7035fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_textAtOffset(long offset, IA2TextBoundaryType boundaryType, long * startOffset, long * endOffset, BSTR * text)
7045fdc4257SSteve Yin {
7055fdc4257SSteve Yin 
7065fdc4257SSteve Yin 
7075fdc4257SSteve Yin 	CHECK_ENABLE_INF
7085fdc4257SSteve Yin 
7095fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
7105fdc4257SSteve Yin 
7115fdc4257SSteve Yin     if (startOffset == NULL || text == NULL ||endOffset == NULL)
7125fdc4257SSteve Yin         return E_INVALIDARG;
7135fdc4257SSteve Yin     // #CHECK XInterface#
7145fdc4257SSteve Yin     if(!pRXText.is())
7155fdc4257SSteve Yin         return E_FAIL;
7165fdc4257SSteve Yin 
7175fdc4257SSteve Yin     // In New UNO IAccessibleText.idl these constant values are defined as follows:
7185fdc4257SSteve Yin     //
7195fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_CHAR = -1;
7205fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_TO_CURSOR_POS = -2;
7215fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_WORD = -3;
7225fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_WORD = -4;
7235fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_SENTENCE = -5;
7245fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_SENTENCE = -6;
7255fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_START_OF_LINE = -7;
7265fdc4257SSteve Yin     //  const long TEXT_BOUNDARY_END_OF_LINE = -8;
7275fdc4257SSteve Yin     //
7285fdc4257SSteve Yin     // In UNO, the corresponding values are as follows:
7295fdc4257SSteve Yin     //
7305fdc4257SSteve Yin     //  const short CHARACTER = 1;
7315fdc4257SSteve Yin     //  const short WORD = 2;
7325fdc4257SSteve Yin     //  const short SENTENCE = 3;
7335fdc4257SSteve Yin     //  const short PARAGRAPH = 4;
7345fdc4257SSteve Yin     //  const short LINE = 5;
7355fdc4257SSteve Yin     //  const short GLYPH = 6;
7365fdc4257SSteve Yin     //  const short ATTRIBUTE_RUN = 7;
7375fdc4257SSteve Yin     //
7385fdc4257SSteve Yin 
7395fdc4257SSteve Yin     long			lUnoBoundaryType;
7405fdc4257SSteve Yin 
7415fdc4257SSteve Yin     switch(boundaryType)
7425fdc4257SSteve Yin     {
7435fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_CHAR:
7445fdc4257SSteve Yin         lUnoBoundaryType = 1; // CHARACTER;
7455fdc4257SSteve Yin         break;
7465fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_WORD:
7475fdc4257SSteve Yin         lUnoBoundaryType = 2; // WORD;
7485fdc4257SSteve Yin         break;
7495fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_SENTENCE:
7505fdc4257SSteve Yin         lUnoBoundaryType = 3; // SENTENCE;
7515fdc4257SSteve Yin         break;
7525fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_LINE:
7535fdc4257SSteve Yin         lUnoBoundaryType = 5; // LINE;
7545fdc4257SSteve Yin         break;
7555fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_PARAGRAPH:
7565fdc4257SSteve Yin         lUnoBoundaryType = 4;
7575fdc4257SSteve Yin         break;
7585fdc4257SSteve Yin     case IA2_TEXT_BOUNDARY_ALL:
7595fdc4257SSteve Yin         {
7605fdc4257SSteve Yin             long nChar;
7615fdc4257SSteve Yin             get_nCharacters( &nChar );
7625fdc4257SSteve Yin             *startOffset = 0;
7635fdc4257SSteve Yin             *endOffset = nChar;
7645fdc4257SSteve Yin             return get_text(0, nChar, text);
7655fdc4257SSteve Yin         }
7665fdc4257SSteve Yin         break;
7675fdc4257SSteve Yin     default:
7685fdc4257SSteve Yin         return E_FAIL;
7695fdc4257SSteve Yin     }
7705fdc4257SSteve Yin 
7715fdc4257SSteve Yin     TextSegment segment = GetXInterface()->getTextAtIndex( offset, sal_Int16(lUnoBoundaryType));
7725fdc4257SSteve Yin     ::rtl::OUString ouStr = segment.SegmentText;
7735fdc4257SSteve Yin     SysFreeString(*text);
7745fdc4257SSteve Yin     *text = SysAllocString((OLECHAR*)ouStr.getStr());
7755fdc4257SSteve Yin     *startOffset = segment.SegmentStart;
7765fdc4257SSteve Yin     *endOffset = segment.SegmentEnd;
7775fdc4257SSteve Yin 
7785fdc4257SSteve Yin     return S_OK;
7795fdc4257SSteve Yin 
7805fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
7815fdc4257SSteve Yin }
7825fdc4257SSteve Yin 
7835fdc4257SSteve Yin /**
7845fdc4257SSteve Yin    * Remove selection.
7855fdc4257SSteve Yin    * @param selectionIndex Special selection index
7865fdc4257SSteve Yin    * @param success Variant to accept the memthod called result.
7875fdc4257SSteve Yin    * @return Result.
7885fdc4257SSteve Yin */
removeSelection(long selectionIndex)7895fdc4257SSteve Yin STDMETHODIMP CAccTextBase::removeSelection(long selectionIndex)
7905fdc4257SSteve Yin {
7915fdc4257SSteve Yin 
7925fdc4257SSteve Yin 	CHECK_ENABLE_INF
7935fdc4257SSteve Yin 
7945fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
7955fdc4257SSteve Yin 
7965fdc4257SSteve Yin     // #CHECK XInterface#
7975fdc4257SSteve Yin     if(pUNOInterface == NULL)
7985fdc4257SSteve Yin     {
7995fdc4257SSteve Yin         return E_FAIL;
8005fdc4257SSteve Yin     }
8015fdc4257SSteve Yin 
8025fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
8035fdc4257SSteve Yin 
8045fdc4257SSteve Yin     Reference< XAccessibleTextSelection > pRExtension(pRContext,UNO_QUERY);
8055fdc4257SSteve Yin 
8065fdc4257SSteve Yin     if( pRExtension.is() )
8075fdc4257SSteve Yin     {
8085fdc4257SSteve Yin         pRExtension->removeSelection(selectionIndex);
8095fdc4257SSteve Yin         return S_OK;
8105fdc4257SSteve Yin     }
8115fdc4257SSteve Yin 	else
8125fdc4257SSteve Yin     {
8135fdc4257SSteve Yin         GetXInterface()->setSelection(0, 0);
8145fdc4257SSteve Yin         return S_OK;
8155fdc4257SSteve Yin     }
8165fdc4257SSteve Yin 
8175fdc4257SSteve Yin     return E_FAIL;
8185fdc4257SSteve Yin 
8195fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
8205fdc4257SSteve Yin }
8215fdc4257SSteve Yin 
8225fdc4257SSteve Yin /**
8235fdc4257SSteve Yin    * Set caret position.
8245fdc4257SSteve Yin    * @param offset Special position.
8255fdc4257SSteve Yin    * @param success Variant to accept the memthod called result.
8265fdc4257SSteve Yin    * @return Result.
8275fdc4257SSteve Yin */
setCaretOffset(long offset)8285fdc4257SSteve Yin STDMETHODIMP CAccTextBase::setCaretOffset(long offset)
8295fdc4257SSteve Yin {
8305fdc4257SSteve Yin 
8315fdc4257SSteve Yin 	CHECK_ENABLE_INF
8325fdc4257SSteve Yin 
8335fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
8345fdc4257SSteve Yin 
8355fdc4257SSteve Yin     // #CHECK XInterface#
8365fdc4257SSteve Yin     if(!pRXText.is())
8375fdc4257SSteve Yin         return E_FAIL;
8385fdc4257SSteve Yin 
8395fdc4257SSteve Yin     GetXInterface()->setCaretPosition( offset);
8405fdc4257SSteve Yin 
8415fdc4257SSteve Yin     return S_OK;
8425fdc4257SSteve Yin 
8435fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
8445fdc4257SSteve Yin }
8455fdc4257SSteve Yin 
8465fdc4257SSteve Yin /**
8475fdc4257SSteve Yin    * Set special selection.
8485fdc4257SSteve Yin    * @param selectionIndex Special selection index.
8495fdc4257SSteve Yin    * @param startOffset start position.
8505fdc4257SSteve Yin    * @param endOffset end position.
8515fdc4257SSteve Yin    * @param success Variant to accept the memthod called result.
8525fdc4257SSteve Yin    * @return Result.
8535fdc4257SSteve Yin */
setSelection(long,long startOffset,long endOffset)8545fdc4257SSteve Yin STDMETHODIMP CAccTextBase::setSelection(long, long startOffset, long endOffset)
8555fdc4257SSteve Yin {
8565fdc4257SSteve Yin 
8575fdc4257SSteve Yin 	CHECK_ENABLE_INF
8585fdc4257SSteve Yin 
8595fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
8605fdc4257SSteve Yin 
8615fdc4257SSteve Yin     // #CHECK XInterface#
8625fdc4257SSteve Yin     if(!pRXText.is())
8635fdc4257SSteve Yin     {
8645fdc4257SSteve Yin         return E_FAIL;
8655fdc4257SSteve Yin     }
8665fdc4257SSteve Yin 
8675fdc4257SSteve Yin     GetXInterface()->setSelection( startOffset,	endOffset );
8685fdc4257SSteve Yin 
8695fdc4257SSteve Yin     return S_OK;
8705fdc4257SSteve Yin 
8715fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
8725fdc4257SSteve Yin }
8735fdc4257SSteve Yin 
8745fdc4257SSteve Yin /**
8755fdc4257SSteve Yin    * Get characters count.
8765fdc4257SSteve Yin    * @param nCharacters Variant to accept the characters count.
8775fdc4257SSteve Yin    * @return Result.
8785fdc4257SSteve Yin */
get_nCharacters(long * nCharacters)8795fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_nCharacters(long * nCharacters)
8805fdc4257SSteve Yin {
8815fdc4257SSteve Yin 
8825fdc4257SSteve Yin 	CHECK_ENABLE_INF
8835fdc4257SSteve Yin 
8845fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
8855fdc4257SSteve Yin 
8865fdc4257SSteve Yin     if (nCharacters == NULL)
8875fdc4257SSteve Yin         return E_INVALIDARG;
8885fdc4257SSteve Yin     // #CHECK XInterface#
8895fdc4257SSteve Yin     if(!pRXText.is())
8905fdc4257SSteve Yin     {
8915fdc4257SSteve Yin         *nCharacters = 0;
8925fdc4257SSteve Yin         return S_OK;
8935fdc4257SSteve Yin     }
8945fdc4257SSteve Yin 
8955fdc4257SSteve Yin     *nCharacters = GetXInterface()->getCharacterCount();
8965fdc4257SSteve Yin 
8975fdc4257SSteve Yin     return S_OK;
8985fdc4257SSteve Yin 
8995fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
9005fdc4257SSteve Yin }
9015fdc4257SSteve Yin 
9025fdc4257SSteve Yin // added by qiuhd, 2006/07/03, for direver 07/11
get_newText(IA2TextSegment *)9035fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_newText( IA2TextSegment *)
9045fdc4257SSteve Yin {
9055fdc4257SSteve Yin     return E_NOTIMPL;
9065fdc4257SSteve Yin }
9075fdc4257SSteve Yin 
get_oldText(IA2TextSegment *)9085fdc4257SSteve Yin STDMETHODIMP CAccTextBase::get_oldText( IA2TextSegment *)
9095fdc4257SSteve Yin {
9105fdc4257SSteve Yin     return E_NOTIMPL;
9115fdc4257SSteve Yin }
9125fdc4257SSteve Yin 
9135fdc4257SSteve Yin /**
9145fdc4257SSteve Yin    * Scroll to special sub-string .
9155fdc4257SSteve Yin    * @param startIndex Start index of sub string.
9165fdc4257SSteve Yin    * @param endIndex   End index of sub string.
9175fdc4257SSteve Yin    * @return Result.
9185fdc4257SSteve Yin */
scrollSubstringToPoint(long,long,IA2CoordinateType,long,long)9195fdc4257SSteve Yin STDMETHODIMP CAccTextBase::scrollSubstringToPoint(long, long, IA2CoordinateType, long, long )
9205fdc4257SSteve Yin {
9215fdc4257SSteve Yin 
9225fdc4257SSteve Yin 
9235fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
9245fdc4257SSteve Yin 
9255fdc4257SSteve Yin     return E_NOTIMPL;
9265fdc4257SSteve Yin 
9275fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
9285fdc4257SSteve Yin }
9295fdc4257SSteve Yin 
scrollSubstringTo(long,long,IA2ScrollType)9305fdc4257SSteve Yin STDMETHODIMP CAccTextBase::scrollSubstringTo(long, long, IA2ScrollType)
9315fdc4257SSteve Yin {
9325fdc4257SSteve Yin 
9335fdc4257SSteve Yin 
9345fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
9355fdc4257SSteve Yin 
9365fdc4257SSteve Yin     return E_NOTIMPL;
9375fdc4257SSteve Yin 
9385fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
9395fdc4257SSteve Yin }
9405fdc4257SSteve Yin 
9415fdc4257SSteve Yin /**
9425fdc4257SSteve Yin    * Put UNO interface.
9435fdc4257SSteve Yin    * @param pXInterface UNO interface.
9445fdc4257SSteve Yin    * @return Result.
9455fdc4257SSteve Yin */
put_XInterface(long pXInterface)9465fdc4257SSteve Yin STDMETHODIMP CAccTextBase::put_XInterface(long pXInterface)
9475fdc4257SSteve Yin {
9485fdc4257SSteve Yin 
9495fdc4257SSteve Yin 	CHECK_ENABLE_INF
9505fdc4257SSteve Yin 
9515fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
9525fdc4257SSteve Yin 
9535fdc4257SSteve Yin     CUNOXWrapper::put_XInterface(pXInterface);
9545fdc4257SSteve Yin     //special query.
9555fdc4257SSteve Yin     if(pUNOInterface == NULL)
9565fdc4257SSteve Yin         return E_FAIL;
9575fdc4257SSteve Yin     Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
9585fdc4257SSteve Yin     if( !pRContext.is() )
9595fdc4257SSteve Yin     {
9605fdc4257SSteve Yin         return E_FAIL;
9615fdc4257SSteve Yin     }
9625fdc4257SSteve Yin     Reference<XAccessibleText> pRXI(pRContext,UNO_QUERY);
9635fdc4257SSteve Yin     if( !pRXI.is() )
9645fdc4257SSteve Yin         pRXText = NULL;
9655fdc4257SSteve Yin     else
9665fdc4257SSteve Yin         pRXText = pRXI;
9675fdc4257SSteve Yin     return S_OK;
9685fdc4257SSteve Yin 
9695fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
9705fdc4257SSteve Yin }
9715fdc4257SSteve Yin 
ReplaceOneChar(OUString oldOUString,OUString replacedChar,OUString replaceStr)9725fdc4257SSteve Yin OUString ReplaceOneChar(OUString oldOUString, OUString replacedChar, OUString replaceStr)
9735fdc4257SSteve Yin {
9745fdc4257SSteve Yin     int iReplace = -1;
9755fdc4257SSteve Yin     iReplace = oldOUString.lastIndexOf(replacedChar);
9765fdc4257SSteve Yin     if (iReplace > -1)
9775fdc4257SSteve Yin     {
9785fdc4257SSteve Yin         for(;iReplace>-1;)
9795fdc4257SSteve Yin         {
9805fdc4257SSteve Yin             oldOUString = oldOUString.replaceAt(iReplace,1, replaceStr);
9815fdc4257SSteve Yin             iReplace=oldOUString.lastIndexOf(replacedChar,iReplace);
9825fdc4257SSteve Yin         }
9835fdc4257SSteve Yin     }
9845fdc4257SSteve Yin     return oldOUString;
9855fdc4257SSteve Yin 
9865fdc4257SSteve Yin }
ReplaceFourChar(OUString oldOUString)9875fdc4257SSteve Yin OUString ReplaceFourChar(OUString oldOUString)
9885fdc4257SSteve Yin {
9895fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii("\\"),OUString::createFromAscii("\\\\"));
9905fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii(";"),OUString::createFromAscii("\\;"));
9915fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii("="),OUString::createFromAscii("\\="));
9925fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii(","),OUString::createFromAscii("\\,"));
9935fdc4257SSteve Yin     oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii(":"),OUString::createFromAscii("\\:"));
9945fdc4257SSteve Yin     return oldOUString;
9955fdc4257SSteve Yin }
996