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