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