xref: /AOO41X/main/winaccessibility/source/UAccCOM/AccEditableText.cpp (revision 5fdc4257b5e43545f8f7841d9e8303d3a99b1714)
1*5fdc4257SSteve Yin /*************************************************************************
2*5fdc4257SSteve Yin  *
3*5fdc4257SSteve Yin  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*5fdc4257SSteve Yin  *
5*5fdc4257SSteve Yin  * Copyright IBM Corporation 2010.
6*5fdc4257SSteve Yin  * Copyright 2000, 2010 Oracle and/or its affiliates.
7*5fdc4257SSteve Yin  *
8*5fdc4257SSteve Yin  * OpenOffice.org - a multi-platform office productivity suite
9*5fdc4257SSteve Yin  *
10*5fdc4257SSteve Yin  * This file is part of OpenOffice.org.
11*5fdc4257SSteve Yin  *
12*5fdc4257SSteve Yin  * OpenOffice.org is free software: you can redistribute it and/or modify
13*5fdc4257SSteve Yin  * it under the terms of the GNU Lesser General Public License version 3
14*5fdc4257SSteve Yin  * only, as published by the Free Software Foundation.
15*5fdc4257SSteve Yin  *
16*5fdc4257SSteve Yin  * OpenOffice.org is distributed in the hope that it will be useful,
17*5fdc4257SSteve Yin  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18*5fdc4257SSteve Yin  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19*5fdc4257SSteve Yin  * GNU Lesser General Public License version 3 for more details
20*5fdc4257SSteve Yin  * (a copy is included in the LICENSE file that accompanied this code).
21*5fdc4257SSteve Yin  *
22*5fdc4257SSteve Yin  * You should have received a copy of the GNU Lesser General Public License
23*5fdc4257SSteve Yin  * version 3 along with OpenOffice.org.  If not, see
24*5fdc4257SSteve Yin  * <http://www.openoffice.org/license.html>
25*5fdc4257SSteve Yin  * for a copy of the LGPLv3 License.
26*5fdc4257SSteve Yin  *
27*5fdc4257SSteve Yin  ************************************************************************/
28*5fdc4257SSteve Yin 
29*5fdc4257SSteve Yin /**
30*5fdc4257SSteve Yin  * 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