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 * AccEditableText.cpp : Implementation of CUAccCOMApp and DLL registration. 31*5fdc4257SSteve Yin */ 32*5fdc4257SSteve Yin #include "stdafx.h" 33*5fdc4257SSteve Yin #include "UAccCOM2.h" 34*5fdc4257SSteve Yin #include "AccEditableText.h" 35*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp> 36*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleContext.hpp> 37*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleText.hpp> 38*5fdc4257SSteve Yin #include <com/sun/star/awt/FontSlant.hpp> 39*5fdc4257SSteve Yin #include <com/sun/star/beans/PropertyValue.hpp> 40*5fdc4257SSteve Yin #include <com/sun/star/style/LineSpacing.hpp> 41*5fdc4257SSteve Yin #include <com/sun/star/style/TabStop.hpp> 42*5fdc4257SSteve Yin #include <vector> 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 com::sun::star::awt; 47*5fdc4257SSteve Yin using namespace com::sun::star::beans; 48*5fdc4257SSteve Yin using namespace std; 49*5fdc4257SSteve Yin 50*5fdc4257SSteve Yin /** 51*5fdc4257SSteve Yin * Copys a range of text to the clipboard. 52*5fdc4257SSteve Yin * 53*5fdc4257SSteve Yin * @param startOffset the start offset of copying. 54*5fdc4257SSteve Yin * @param endOffset the end offset of copying. 55*5fdc4257SSteve Yin * @param success the boolean result to be returned. 56*5fdc4257SSteve Yin */ 57*5fdc4257SSteve Yin STDMETHODIMP CAccEditableText::copyText(long startOffset, long endOffset) 58*5fdc4257SSteve Yin { 59*5fdc4257SSteve Yin 60*5fdc4257SSteve Yin CHECK_ENABLE_INF 61*5fdc4257SSteve Yin 62*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 63*5fdc4257SSteve Yin 64*5fdc4257SSteve Yin // #CHECK XInterface# 65*5fdc4257SSteve Yin if(!pRXEdtTxt.is()) 66*5fdc4257SSteve Yin { 67*5fdc4257SSteve Yin return E_FAIL; 68*5fdc4257SSteve Yin } 69*5fdc4257SSteve Yin 70*5fdc4257SSteve Yin if ( GetXInterface()->copyText( startOffset, endOffset ) ) 71*5fdc4257SSteve Yin return S_OK; 72*5fdc4257SSteve Yin 73*5fdc4257SSteve Yin return E_FAIL; 74*5fdc4257SSteve Yin 75*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 76*5fdc4257SSteve Yin } 77*5fdc4257SSteve Yin 78*5fdc4257SSteve Yin /** 79*5fdc4257SSteve Yin * Deletes a range of text. 80*5fdc4257SSteve Yin * 81*5fdc4257SSteve Yin * @param startOffset the start offset of deleting. 82*5fdc4257SSteve Yin * @param endOffset the end offset of deleting. 83*5fdc4257SSteve Yin * @param success the boolean result to be returned. 84*5fdc4257SSteve Yin */ 85*5fdc4257SSteve Yin STDMETHODIMP CAccEditableText::deleteText(long startOffset, long endOffset) 86*5fdc4257SSteve Yin { 87*5fdc4257SSteve Yin 88*5fdc4257SSteve Yin CHECK_ENABLE_INF 89*5fdc4257SSteve Yin 90*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 91*5fdc4257SSteve Yin 92*5fdc4257SSteve Yin if( !pRXEdtTxt.is() ) 93*5fdc4257SSteve Yin return E_FAIL; 94*5fdc4257SSteve Yin 95*5fdc4257SSteve Yin if( GetXInterface()->deleteText( startOffset, endOffset ) ) 96*5fdc4257SSteve Yin return S_OK; 97*5fdc4257SSteve Yin 98*5fdc4257SSteve Yin return E_FAIL; 99*5fdc4257SSteve Yin 100*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 101*5fdc4257SSteve Yin } 102*5fdc4257SSteve Yin 103*5fdc4257SSteve Yin /** 104*5fdc4257SSteve Yin * Inserts text at a specified offset. 105*5fdc4257SSteve Yin * 106*5fdc4257SSteve Yin * @param offset the offset of inserting. 107*5fdc4257SSteve Yin * @param text the text to be inserted. 108*5fdc4257SSteve Yin * @param success the boolean result to be returned. 109*5fdc4257SSteve Yin */ 110*5fdc4257SSteve Yin STDMETHODIMP CAccEditableText::insertText(long offset, BSTR * text) 111*5fdc4257SSteve Yin { 112*5fdc4257SSteve Yin 113*5fdc4257SSteve Yin CHECK_ENABLE_INF 114*5fdc4257SSteve Yin 115*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 116*5fdc4257SSteve Yin 117*5fdc4257SSteve Yin if (text == NULL) 118*5fdc4257SSteve Yin return E_INVALIDARG; 119*5fdc4257SSteve Yin 120*5fdc4257SSteve Yin if( !pRXEdtTxt.is() ) 121*5fdc4257SSteve Yin return E_FAIL; 122*5fdc4257SSteve Yin 123*5fdc4257SSteve Yin ::rtl::OUString ouStr(*text); 124*5fdc4257SSteve Yin 125*5fdc4257SSteve Yin if( GetXInterface()->insertText( ouStr, offset ) ) 126*5fdc4257SSteve Yin return S_OK; 127*5fdc4257SSteve Yin 128*5fdc4257SSteve Yin return E_FAIL; 129*5fdc4257SSteve Yin 130*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 131*5fdc4257SSteve Yin } 132*5fdc4257SSteve Yin 133*5fdc4257SSteve Yin /** 134*5fdc4257SSteve Yin * Cuts a range of text to the clipboard. 135*5fdc4257SSteve Yin * 136*5fdc4257SSteve Yin * @param startOffset the start offset of cuting. 137*5fdc4257SSteve Yin * @param endOffset the end offset of cuting. 138*5fdc4257SSteve Yin * @param success the boolean result to be returned. 139*5fdc4257SSteve Yin */ 140*5fdc4257SSteve Yin STDMETHODIMP CAccEditableText::cutText(long startOffset, long endOffset) 141*5fdc4257SSteve Yin { 142*5fdc4257SSteve Yin 143*5fdc4257SSteve Yin CHECK_ENABLE_INF 144*5fdc4257SSteve Yin 145*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 146*5fdc4257SSteve Yin 147*5fdc4257SSteve Yin if( !pRXEdtTxt.is() ) 148*5fdc4257SSteve Yin return E_FAIL; 149*5fdc4257SSteve Yin 150*5fdc4257SSteve Yin if( GetXInterface()->cutText( startOffset, endOffset ) ) 151*5fdc4257SSteve Yin return S_OK; 152*5fdc4257SSteve Yin 153*5fdc4257SSteve Yin return E_FAIL; 154*5fdc4257SSteve Yin 155*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 156*5fdc4257SSteve Yin } 157*5fdc4257SSteve Yin 158*5fdc4257SSteve Yin /** 159*5fdc4257SSteve Yin * Pastes text from clipboard at specified offset. 160*5fdc4257SSteve Yin * 161*5fdc4257SSteve Yin * @param offset the offset of pasting. 162*5fdc4257SSteve Yin * @param success the boolean result to be returned. 163*5fdc4257SSteve Yin */ 164*5fdc4257SSteve Yin STDMETHODIMP CAccEditableText::pasteText(long offset) 165*5fdc4257SSteve Yin { 166*5fdc4257SSteve Yin 167*5fdc4257SSteve Yin CHECK_ENABLE_INF 168*5fdc4257SSteve Yin 169*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 170*5fdc4257SSteve Yin 171*5fdc4257SSteve Yin if( !pRXEdtTxt.is() ) 172*5fdc4257SSteve Yin return E_FAIL; 173*5fdc4257SSteve Yin 174*5fdc4257SSteve Yin if( GetXInterface()->pasteText( offset ) ) 175*5fdc4257SSteve Yin return S_OK; 176*5fdc4257SSteve Yin 177*5fdc4257SSteve Yin return E_FAIL; 178*5fdc4257SSteve Yin 179*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 180*5fdc4257SSteve Yin } 181*5fdc4257SSteve Yin 182*5fdc4257SSteve Yin /** 183*5fdc4257SSteve Yin * Replaces range of text with new text. 184*5fdc4257SSteve Yin * 185*5fdc4257SSteve Yin * @param startOffset the start offset of replacing. 186*5fdc4257SSteve Yin * @param endOffset the end offset of replacing. 187*5fdc4257SSteve Yin * @param text the replacing text. 188*5fdc4257SSteve Yin * @param success the boolean result to be returned. 189*5fdc4257SSteve Yin */ 190*5fdc4257SSteve Yin STDMETHODIMP CAccEditableText::replaceText(long startOffset, long endOffset, BSTR * text) 191*5fdc4257SSteve Yin { 192*5fdc4257SSteve Yin 193*5fdc4257SSteve Yin CHECK_ENABLE_INF 194*5fdc4257SSteve Yin 195*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 196*5fdc4257SSteve Yin 197*5fdc4257SSteve Yin // #CHECK# 198*5fdc4257SSteve Yin if (text == NULL) 199*5fdc4257SSteve Yin return E_INVALIDARG; 200*5fdc4257SSteve Yin if( !pRXEdtTxt.is() ) 201*5fdc4257SSteve Yin return E_FAIL; 202*5fdc4257SSteve Yin 203*5fdc4257SSteve Yin ::rtl::OUString ouStr(*text); 204*5fdc4257SSteve Yin 205*5fdc4257SSteve Yin if( GetXInterface()->replaceText( startOffset,endOffset, ouStr) ) 206*5fdc4257SSteve Yin return S_OK; 207*5fdc4257SSteve Yin return E_FAIL; 208*5fdc4257SSteve Yin 209*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 210*5fdc4257SSteve Yin } 211*5fdc4257SSteve Yin 212*5fdc4257SSteve Yin /** 213*5fdc4257SSteve Yin * Sets attributes of range of text. 214*5fdc4257SSteve Yin * 215*5fdc4257SSteve Yin * @param startOffset the start offset. 216*5fdc4257SSteve Yin * @param endOffset the end offset. 217*5fdc4257SSteve Yin * @param attributes the attribute text. 218*5fdc4257SSteve Yin * @param success the boolean result to be returned. 219*5fdc4257SSteve Yin */ 220*5fdc4257SSteve Yin STDMETHODIMP CAccEditableText::setAttributes(long startOffset, long endOffset, BSTR * attributes) 221*5fdc4257SSteve Yin { 222*5fdc4257SSteve Yin 223*5fdc4257SSteve Yin CHECK_ENABLE_INF 224*5fdc4257SSteve Yin 225*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 226*5fdc4257SSteve Yin 227*5fdc4257SSteve Yin // #CHECK# 228*5fdc4257SSteve Yin if (attributes == NULL) 229*5fdc4257SSteve Yin return E_INVALIDARG; 230*5fdc4257SSteve Yin if( !pRXEdtTxt.is() ) 231*5fdc4257SSteve Yin return E_FAIL; 232*5fdc4257SSteve Yin 233*5fdc4257SSteve Yin ::rtl::OUString ouStr(*attributes); 234*5fdc4257SSteve Yin 235*5fdc4257SSteve Yin sal_Int32 nIndex = 0; 236*5fdc4257SSteve Yin sal_Unicode cTok = ';'; 237*5fdc4257SSteve Yin vector< ::rtl::OUString > vecAttr; 238*5fdc4257SSteve Yin do 239*5fdc4257SSteve Yin { 240*5fdc4257SSteve Yin ::rtl::OUString ouToken = ouStr.getToken(0, cTok, nIndex); 241*5fdc4257SSteve Yin vecAttr.push_back(ouToken); 242*5fdc4257SSteve Yin } 243*5fdc4257SSteve Yin while(nIndex >= 0); 244*5fdc4257SSteve Yin 245*5fdc4257SSteve Yin Sequence< PropertyValue > beanSeq(vecAttr.size()); 246*5fdc4257SSteve Yin for(unsigned int i = 0; i < vecAttr.size(); i ++) 247*5fdc4257SSteve Yin { 248*5fdc4257SSteve Yin ::rtl::OUString attr = vecAttr[i]; 249*5fdc4257SSteve Yin sal_Int32 nPos = attr.indexOf(':'); 250*5fdc4257SSteve Yin if(nPos > -1) 251*5fdc4257SSteve Yin { 252*5fdc4257SSteve Yin ::rtl::OUString attrName = attr.copy(0, nPos); 253*5fdc4257SSteve Yin ::rtl::OUString attrValue = attr.copy(nPos + 1, attr.getLength() - nPos - 1); 254*5fdc4257SSteve Yin beanSeq[i].Name = attrName; 255*5fdc4257SSteve Yin get_AnyFromOLECHAR(attrName, attrValue, beanSeq[i].Value); 256*5fdc4257SSteve Yin } 257*5fdc4257SSteve Yin } 258*5fdc4257SSteve Yin 259*5fdc4257SSteve Yin if( GetXInterface()->setAttributes( startOffset,endOffset, beanSeq) ) 260*5fdc4257SSteve Yin return S_OK; 261*5fdc4257SSteve Yin 262*5fdc4257SSteve Yin return E_FAIL; 263*5fdc4257SSteve Yin 264*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 265*5fdc4257SSteve Yin } 266*5fdc4257SSteve Yin 267*5fdc4257SSteve Yin /** 268*5fdc4257SSteve Yin * Convert attributes string to Any type. 269*5fdc4257SSteve Yin * Reference to infra\accessibility\bridge\org\openoffice\java\accessibility\AccessibleTextImpl.java 270*5fdc4257SSteve Yin * 271*5fdc4257SSteve Yin * @param ouName the string of attribute name. 272*5fdc4257SSteve Yin * @param ouValue the string of attribute value. 273*5fdc4257SSteve Yin * @param rAny the Any object to be returned. 274*5fdc4257SSteve Yin */ 275*5fdc4257SSteve Yin void CAccEditableText::get_AnyFromOLECHAR(const ::rtl::OUString &ouName, const ::rtl::OUString &ouValue, Any &rAny) 276*5fdc4257SSteve Yin { 277*5fdc4257SSteve Yin if(ouName.compareTo(L"CharBackColor") == 0 || 278*5fdc4257SSteve Yin ouName.compareTo(L"CharColor") == 0 || 279*5fdc4257SSteve Yin ouName.compareTo(L"ParaAdjust") == 0 || 280*5fdc4257SSteve Yin ouName.compareTo(L"ParaFirstLineIndent") == 0 || 281*5fdc4257SSteve Yin ouName.compareTo(L"ParaLeftMargin") == 0 || 282*5fdc4257SSteve Yin ouName.compareTo(L"ParaRightMargin") == 0 || 283*5fdc4257SSteve Yin ouName.compareTo(L"ParaTopMargin") == 0 || 284*5fdc4257SSteve Yin ouName.compareTo(L"ParaBottomMargin") == 0 || 285*5fdc4257SSteve Yin ouName.compareTo(L"CharFontPitch") == 0) 286*5fdc4257SSteve Yin { 287*5fdc4257SSteve Yin // Convert to int. 288*5fdc4257SSteve Yin // NOTE: CharFontPitch is not implemented in java file. 289*5fdc4257SSteve Yin sal_Int32 nValue = ouValue.toInt32(); 290*5fdc4257SSteve Yin rAny.setValue(&nValue, getCppuType((sal_Int32 *)0)); 291*5fdc4257SSteve Yin } 292*5fdc4257SSteve Yin else if(ouName.compareTo(L"CharShadowed") == 0 || 293*5fdc4257SSteve Yin ouName.compareTo(L"CharContoured") == 0) 294*5fdc4257SSteve Yin { 295*5fdc4257SSteve Yin // Convert to boolean. 296*5fdc4257SSteve Yin boolean nValue = (boolean)ouValue.toBoolean(); 297*5fdc4257SSteve Yin rAny.setValue(&nValue, getCppuType((sal_Bool *)sal_False)); 298*5fdc4257SSteve Yin } 299*5fdc4257SSteve Yin else if(ouName.compareTo(L"CharEscapement") == 0 || 300*5fdc4257SSteve Yin ouName.compareTo(L"CharStrikeout") == 0 || 301*5fdc4257SSteve Yin ouName.compareTo(L"CharUnderline") == 0 || 302*5fdc4257SSteve Yin ouName.compareTo(L"CharFontPitch") == 0) 303*5fdc4257SSteve Yin { 304*5fdc4257SSteve Yin // Convert to short. 305*5fdc4257SSteve Yin short nValue = (short)ouValue.toInt32(); 306*5fdc4257SSteve Yin rAny.setValue(&nValue, getCppuType((short *)0)); 307*5fdc4257SSteve Yin } 308*5fdc4257SSteve Yin else if(ouName.compareTo(L"CharHeight") == 0 || 309*5fdc4257SSteve Yin ouName.compareTo(L"CharWeight") == 0) 310*5fdc4257SSteve Yin { 311*5fdc4257SSteve Yin // Convert to float. 312*5fdc4257SSteve Yin float fValue = ouValue.toFloat(); 313*5fdc4257SSteve Yin rAny.setValue(&fValue, getCppuType((float *)0)); 314*5fdc4257SSteve Yin } 315*5fdc4257SSteve Yin else if(ouName.compareTo(L"CharFontName") == 0) 316*5fdc4257SSteve Yin { 317*5fdc4257SSteve Yin // Convert to string. 318*5fdc4257SSteve Yin rAny.setValue(&ouValue, getCppuType((::rtl::OUString *)0)); 319*5fdc4257SSteve Yin } 320*5fdc4257SSteve Yin else if(ouName.compareTo(L"CharPosture") == 0) 321*5fdc4257SSteve Yin { 322*5fdc4257SSteve Yin // Convert to FontSlant. 323*5fdc4257SSteve Yin ::com::sun::star::awt::FontSlant fontSlant = (::com::sun::star::awt::FontSlant)ouValue.toInt32(); 324*5fdc4257SSteve Yin rAny.setValue(&fontSlant, getCppuType((::com::sun::star::awt::FontSlant*)0)); 325*5fdc4257SSteve Yin } 326*5fdc4257SSteve Yin else if(ouName.compareTo(L"ParaTabStops") == 0) 327*5fdc4257SSteve Yin { 328*5fdc4257SSteve Yin // 329*5fdc4257SSteve Yin // Convert to the Sequence with TabStop element. 330*5fdc4257SSteve Yin vector< ::com::sun::star::style::TabStop > vecTabStop; 331*5fdc4257SSteve Yin ::com::sun::star::style::TabStop tabStop; 332*5fdc4257SSteve Yin ::rtl::OUString ouSubValue; 333*5fdc4257SSteve Yin sal_Int32 nIndex = 0; 334*5fdc4257SSteve Yin sal_Int32 pos = 0, posComma = 0; 335*5fdc4257SSteve Yin 336*5fdc4257SSteve Yin do 337*5fdc4257SSteve Yin { 338*5fdc4257SSteve Yin // Position. 339*5fdc4257SSteve Yin pos = ouValue.indexOf(L"Position=", pos); 340*5fdc4257SSteve Yin if(pos != -1) 341*5fdc4257SSteve Yin { 342*5fdc4257SSteve Yin posComma = ouValue.indexOf(',', pos + 9); // 9 = length of "Position=". 343*5fdc4257SSteve Yin if(posComma != -1) 344*5fdc4257SSteve Yin { 345*5fdc4257SSteve Yin ouSubValue = ouValue.copy(pos + 9, posComma - pos - 9); 346*5fdc4257SSteve Yin tabStop.Position = ouSubValue.toInt32(); 347*5fdc4257SSteve Yin pos = posComma + 1; 348*5fdc4257SSteve Yin 349*5fdc4257SSteve Yin // TabAlign. 350*5fdc4257SSteve Yin pos = ouValue.indexOf(L"TabAlign=", pos); 351*5fdc4257SSteve Yin if(pos != -1) 352*5fdc4257SSteve Yin { 353*5fdc4257SSteve Yin posComma = ouValue.indexOf(',', pos + 9); // 9 = length of "TabAlign=". 354*5fdc4257SSteve Yin if(posComma != -1) 355*5fdc4257SSteve Yin { 356*5fdc4257SSteve Yin ouSubValue = ouValue.copy(pos + 9, posComma - pos - 9); 357*5fdc4257SSteve Yin tabStop.Alignment = (::com::sun::star::style::TabAlign)ouSubValue.toInt32(); 358*5fdc4257SSteve Yin pos = posComma + 1; 359*5fdc4257SSteve Yin 360*5fdc4257SSteve Yin // DecimalChar. 361*5fdc4257SSteve Yin pos = ouValue.indexOf(L"DecimalChar=", pos); 362*5fdc4257SSteve Yin if(pos != -1) 363*5fdc4257SSteve Yin { 364*5fdc4257SSteve Yin posComma = ouValue.indexOf(',', pos + 11); // 11 = length of "TabAlign=". 365*5fdc4257SSteve Yin if(posComma != -1) 366*5fdc4257SSteve Yin { 367*5fdc4257SSteve Yin ouSubValue = ouValue.copy(pos + 11, posComma - pos - 11); 368*5fdc4257SSteve Yin tabStop.DecimalChar = (sal_Unicode)ouSubValue.toChar(); 369*5fdc4257SSteve Yin pos = posComma + 1; 370*5fdc4257SSteve Yin 371*5fdc4257SSteve Yin // FillChar. 372*5fdc4257SSteve Yin pos = ouValue.indexOf(L"FillChar=", pos); 373*5fdc4257SSteve Yin if(pos != -1) 374*5fdc4257SSteve Yin { 375*5fdc4257SSteve Yin posComma = ouValue.indexOf(',', pos + 9); // 9 = length of "TabAlign=". 376*5fdc4257SSteve Yin if(posComma != -1) 377*5fdc4257SSteve Yin { 378*5fdc4257SSteve Yin ouSubValue = ouValue.copy(pos + 9, posComma - pos - 9); 379*5fdc4257SSteve Yin tabStop.DecimalChar = (sal_Unicode)ouSubValue.toChar(); 380*5fdc4257SSteve Yin pos = posComma + 1; 381*5fdc4257SSteve Yin 382*5fdc4257SSteve Yin // Complete TabStop element. 383*5fdc4257SSteve Yin vecTabStop.push_back(tabStop); 384*5fdc4257SSteve Yin } 385*5fdc4257SSteve Yin else 386*5fdc4257SSteve Yin break; // No match comma. 387*5fdc4257SSteve Yin } 388*5fdc4257SSteve Yin else 389*5fdc4257SSteve Yin break; // No match FillChar. 390*5fdc4257SSteve Yin } 391*5fdc4257SSteve Yin else 392*5fdc4257SSteve Yin break; // No match comma. 393*5fdc4257SSteve Yin } 394*5fdc4257SSteve Yin else 395*5fdc4257SSteve Yin break; // No match DecimalChar. 396*5fdc4257SSteve Yin } 397*5fdc4257SSteve Yin else 398*5fdc4257SSteve Yin break; // No match comma. 399*5fdc4257SSteve Yin } 400*5fdc4257SSteve Yin else 401*5fdc4257SSteve Yin break; // No match TabAlign. 402*5fdc4257SSteve Yin } 403*5fdc4257SSteve Yin else 404*5fdc4257SSteve Yin break; // No match comma. 405*5fdc4257SSteve Yin } 406*5fdc4257SSteve Yin else 407*5fdc4257SSteve Yin break; // No match Position. 408*5fdc4257SSteve Yin } 409*5fdc4257SSteve Yin while(pos < ouValue.getLength()); 410*5fdc4257SSteve Yin 411*5fdc4257SSteve Yin // 412*5fdc4257SSteve Yin // Dump into Sequence. 413*5fdc4257SSteve Yin int iSeqLen = (vecTabStop.size() == 0) ? 1 : vecTabStop.size(); 414*5fdc4257SSteve Yin Sequence< ::com::sun::star::style::TabStop > seqTabStop(iSeqLen); 415*5fdc4257SSteve Yin 416*5fdc4257SSteve Yin if(vecTabStop.size() != 0) 417*5fdc4257SSteve Yin { 418*5fdc4257SSteve Yin // Dump every element. 419*5fdc4257SSteve Yin for(int i = 0; i < iSeqLen; i ++) 420*5fdc4257SSteve Yin { 421*5fdc4257SSteve Yin seqTabStop[i] = vecTabStop[i]; 422*5fdc4257SSteve Yin } 423*5fdc4257SSteve Yin } 424*5fdc4257SSteve Yin else 425*5fdc4257SSteve Yin { 426*5fdc4257SSteve Yin // Create default value. 427*5fdc4257SSteve Yin seqTabStop[0].Position = 0; 428*5fdc4257SSteve Yin seqTabStop[0].Alignment = ::com::sun::star::style::TabAlign_DEFAULT; 429*5fdc4257SSteve Yin seqTabStop[0].DecimalChar = '.'; 430*5fdc4257SSteve Yin seqTabStop[0].FillChar = ' '; 431*5fdc4257SSteve Yin } 432*5fdc4257SSteve Yin 433*5fdc4257SSteve Yin // Assign to Any object. 434*5fdc4257SSteve Yin rAny.setValue(&seqTabStop, getCppuType((Sequence< ::com::sun::star::style::TabStop >*)0)); 435*5fdc4257SSteve Yin } 436*5fdc4257SSteve Yin else if(ouName.compareTo(L"ParaLineSpacing") == 0) 437*5fdc4257SSteve Yin { 438*5fdc4257SSteve Yin // Parse value string. 439*5fdc4257SSteve Yin ::com::sun::star::style::LineSpacing lineSpacing; 440*5fdc4257SSteve Yin ::rtl::OUString ouSubValue; 441*5fdc4257SSteve Yin sal_Int32 pos = 0, posComma = 0; 442*5fdc4257SSteve Yin 443*5fdc4257SSteve Yin pos = ouValue.indexOf(L"Mode=", pos); 444*5fdc4257SSteve Yin if(pos != -1) 445*5fdc4257SSteve Yin { 446*5fdc4257SSteve Yin posComma = ouValue.indexOf(',', pos + 5); // 5 = length of "Mode=". 447*5fdc4257SSteve Yin if(posComma != -1) 448*5fdc4257SSteve Yin { 449*5fdc4257SSteve Yin ouSubValue = ouValue.copy(pos + 5, posComma - pos - 5); 450*5fdc4257SSteve Yin lineSpacing.Mode = (sal_Int16)ouSubValue.toInt32(); 451*5fdc4257SSteve Yin pos = posComma + 1; 452*5fdc4257SSteve Yin 453*5fdc4257SSteve Yin pos = ouValue.indexOf(L"Height=", pos); 454*5fdc4257SSteve Yin if(pos != -1) 455*5fdc4257SSteve Yin { 456*5fdc4257SSteve Yin ouSubValue = ouValue.copy(pos + 7, ouValue.getLength() - pos - 7); 457*5fdc4257SSteve Yin lineSpacing.Height = (sal_Int16)ouSubValue.toInt32(); 458*5fdc4257SSteve Yin } 459*5fdc4257SSteve Yin else 460*5fdc4257SSteve Yin { 461*5fdc4257SSteve Yin lineSpacing.Height = (sal_Int16)100; // Default height. 462*5fdc4257SSteve Yin } 463*5fdc4257SSteve Yin } 464*5fdc4257SSteve Yin else 465*5fdc4257SSteve Yin { 466*5fdc4257SSteve Yin lineSpacing.Height = (sal_Int16)100; // Default height. 467*5fdc4257SSteve Yin } 468*5fdc4257SSteve Yin } 469*5fdc4257SSteve Yin else 470*5fdc4257SSteve Yin { 471*5fdc4257SSteve Yin // Default Mode and Height. 472*5fdc4257SSteve Yin lineSpacing.Mode = (sal_Int16)0; 473*5fdc4257SSteve Yin lineSpacing.Height = (sal_Int16)100; // Default height. 474*5fdc4257SSteve Yin } 475*5fdc4257SSteve Yin 476*5fdc4257SSteve Yin // Convert to Any object. 477*5fdc4257SSteve Yin rAny.setValue(&lineSpacing, getCppuType((::com::sun::star::style::LineSpacing* )0)); 478*5fdc4257SSteve Yin } 479*5fdc4257SSteve Yin else 480*5fdc4257SSteve Yin { 481*5fdc4257SSteve Yin // Do nothing. 482*5fdc4257SSteve Yin sal_Int32 nDefault = 0; 483*5fdc4257SSteve Yin rAny.setValue(&nDefault, getCppuType((sal_Int32 *)0)); 484*5fdc4257SSteve Yin } 485*5fdc4257SSteve Yin } 486*5fdc4257SSteve Yin 487*5fdc4257SSteve Yin /** 488*5fdc4257SSteve Yin * Overide of IUNOXWrapper. 489*5fdc4257SSteve Yin * 490*5fdc4257SSteve Yin * @param pXInterface the pointer of UNO interface. 491*5fdc4257SSteve Yin */ 492*5fdc4257SSteve Yin STDMETHODIMP CAccEditableText::put_XInterface(long pXInterface) 493*5fdc4257SSteve Yin { 494*5fdc4257SSteve Yin 495*5fdc4257SSteve Yin 496*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 497*5fdc4257SSteve Yin 498*5fdc4257SSteve Yin CUNOXWrapper::put_XInterface(pXInterface); 499*5fdc4257SSteve Yin //special query. 500*5fdc4257SSteve Yin if(pUNOInterface == NULL) 501*5fdc4257SSteve Yin return E_FAIL; 502*5fdc4257SSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 503*5fdc4257SSteve Yin if( !pRContext.is() ) 504*5fdc4257SSteve Yin { 505*5fdc4257SSteve Yin return E_FAIL; 506*5fdc4257SSteve Yin } 507*5fdc4257SSteve Yin Reference<XAccessibleEditableText> pRXI(pRContext,UNO_QUERY); 508*5fdc4257SSteve Yin if( !pRXI.is() ) 509*5fdc4257SSteve Yin pRXEdtTxt = NULL; 510*5fdc4257SSteve Yin else 511*5fdc4257SSteve Yin pRXEdtTxt = pRXI.get(); 512*5fdc4257SSteve Yin return S_OK; 513*5fdc4257SSteve Yin 514*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 515*5fdc4257SSteve Yin } 516