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 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski #include <svx/AccessibleShape.hxx>
27*b1cdbd2cSJim Jagielski #include "svx/DescriptionGenerator.hxx"
28*b1cdbd2cSJim Jagielski #include <svx/AccessibleShapeInfo.hxx>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/view/XSelectionSupplier.hpp>
30*b1cdbd2cSJim Jagielski #include <rtl/uuid.h>
31*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLE_ROLE_HPP_
32*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleRole.hpp>
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLETEXTTYPE_HPP_
35*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleTextType.hpp>
36*b1cdbd2cSJim Jagielski #endif
37*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLE_STATE_TYPE_HPP_
38*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleStateType.hpp>
39*b1cdbd2cSJim Jagielski #endif
40*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XShapes.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XShapeDescriptor.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/FillStyle.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp>
47*b1cdbd2cSJim Jagielski #include <editeng/outlobj.hxx>
48*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
49*b1cdbd2cSJim Jagielski #include <editeng/unoedsrc.hxx>
50*b1cdbd2cSJim Jagielski #include <svx/unoshtxt.hxx>
51*b1cdbd2cSJim Jagielski #include <svx/svdobj.hxx>
52*b1cdbd2cSJim Jagielski #include <svx/svdmodel.hxx>
53*b1cdbd2cSJim Jagielski #include "svx/unoapi.hxx"
54*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Exception.hpp>
55*b1cdbd2cSJim Jagielski #include <svx/ShapeTypeHandler.hxx>
56*b1cdbd2cSJim Jagielski #include <svx/SvxShapeTypes.hxx>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #ifndef _SVX_ACCESSIBILITY_HRC
59*b1cdbd2cSJim Jagielski #include "accessibility.hrc"
60*b1cdbd2cSJim Jagielski #endif
61*b1cdbd2cSJim Jagielski #include "svx/svdstr.hrc"
62*b1cdbd2cSJim Jagielski #include <svx/dialmgr.hxx>
63*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
64*b1cdbd2cSJim Jagielski #include <unotools/accessiblestatesethelper.hxx>
65*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
66*b1cdbd2cSJim Jagielski #include "AccessibleEmptyEditSource.hxx"
67*b1cdbd2cSJim Jagielski #include <svx/svdpage.hxx>
68*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLERELATIONTYPE_HPP_
69*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleRelationType.hpp>
70*b1cdbd2cSJim Jagielski #endif
71*b1cdbd2cSJim Jagielski #ifndef _UTL_ACCESSIBLERELATIONSETHELPER_HXX_
72*b1cdbd2cSJim Jagielski #include <unotools/accessiblerelationsethelper.hxx>
73*b1cdbd2cSJim Jagielski #endif
74*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
75*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::accessibility;
76*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::IndexOutOfBoundsException;
77*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::RuntimeException;
78*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
79*b1cdbd2cSJim Jagielski using ::rtl::OUString;
80*b1cdbd2cSJim Jagielski #include <algorithm>
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski // #include <Accessiblehyperlink.hxx>
83*b1cdbd2cSJim Jagielski namespace accessibility {
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski namespace {
86*b1cdbd2cSJim Jagielski 
GetOptionalProperty(const Reference<beans::XPropertySet> & rxSet,const OUString & rsPropertyName)87*b1cdbd2cSJim Jagielski OUString GetOptionalProperty (
88*b1cdbd2cSJim Jagielski     const Reference<beans::XPropertySet>& rxSet,
89*b1cdbd2cSJim Jagielski     const OUString& rsPropertyName)
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski     OUString sValue;
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski     if (rxSet.is())
94*b1cdbd2cSJim Jagielski     {
95*b1cdbd2cSJim Jagielski         const Reference<beans::XPropertySetInfo> xInfo (rxSet->getPropertySetInfo());
96*b1cdbd2cSJim Jagielski         if ( ! xInfo.is() || xInfo->hasPropertyByName(rsPropertyName))
97*b1cdbd2cSJim Jagielski         {
98*b1cdbd2cSJim Jagielski             try
99*b1cdbd2cSJim Jagielski             {
100*b1cdbd2cSJim Jagielski                 rxSet->getPropertyValue(rsPropertyName) >>= sValue;
101*b1cdbd2cSJim Jagielski             }
102*b1cdbd2cSJim Jagielski             catch (beans::UnknownPropertyException&)
103*b1cdbd2cSJim Jagielski             {
104*b1cdbd2cSJim Jagielski                 // This exception should only be thrown when the property
105*b1cdbd2cSJim Jagielski                 // does not exits (of course) and the XPropertySetInfo is
106*b1cdbd2cSJim Jagielski                 // not available.
107*b1cdbd2cSJim Jagielski             }
108*b1cdbd2cSJim Jagielski         }
109*b1cdbd2cSJim Jagielski     }
110*b1cdbd2cSJim Jagielski     return sValue;
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski } // end of anonymous namespace
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski //=====  internal  ============================================================
119*b1cdbd2cSJim Jagielski 
AccessibleShape(const AccessibleShapeInfo & rShapeInfo,const AccessibleShapeTreeInfo & rShapeTreeInfo)120*b1cdbd2cSJim Jagielski AccessibleShape::AccessibleShape (
121*b1cdbd2cSJim Jagielski     const AccessibleShapeInfo& rShapeInfo,
122*b1cdbd2cSJim Jagielski     const AccessibleShapeTreeInfo& rShapeTreeInfo)
123*b1cdbd2cSJim Jagielski     : AccessibleContextBase (rShapeInfo.mxParent,AccessibleRole::SHAPE),
124*b1cdbd2cSJim Jagielski       mpChildrenManager(NULL),
125*b1cdbd2cSJim Jagielski       mxShape (rShapeInfo.mxShape),
126*b1cdbd2cSJim Jagielski       maShapeTreeInfo (rShapeTreeInfo),
127*b1cdbd2cSJim Jagielski       mnIndex (rShapeInfo.mnIndex),
128*b1cdbd2cSJim Jagielski 	  m_nIndexInParent(-1),
129*b1cdbd2cSJim Jagielski       mpText (NULL),
130*b1cdbd2cSJim Jagielski       mpParent (rShapeInfo.mpChildrenManager)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski 	m_pShape = GetSdrObjectFromXShape(mxShape);
133*b1cdbd2cSJim Jagielski     UpdateNameAndDescription();
134*b1cdbd2cSJim Jagielski }
AccessibleShape(const::com::sun::star::uno::Reference<::com::sun::star::drawing::XShape> & rxShape,const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> & rxParent,const AccessibleShapeTreeInfo & rShapeTreeInfo,sal_Int32 nIndex)135*b1cdbd2cSJim Jagielski AccessibleShape::AccessibleShape (
136*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
137*b1cdbd2cSJim Jagielski             ::com::sun::star::drawing::XShape>& rxShape,
138*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
139*b1cdbd2cSJim Jagielski             ::com::sun::star::accessibility::XAccessible>& rxParent,
140*b1cdbd2cSJim Jagielski         const AccessibleShapeTreeInfo& rShapeTreeInfo,
141*b1cdbd2cSJim Jagielski         sal_Int32 nIndex)
142*b1cdbd2cSJim Jagielski     : AccessibleContextBase (rxParent,AccessibleRole::SHAPE),
143*b1cdbd2cSJim Jagielski       mpChildrenManager(NULL),
144*b1cdbd2cSJim Jagielski       mxShape (rxShape),
145*b1cdbd2cSJim Jagielski       maShapeTreeInfo (rShapeTreeInfo),
146*b1cdbd2cSJim Jagielski       mnIndex (nIndex),
147*b1cdbd2cSJim Jagielski       m_nIndexInParent(-1),
148*b1cdbd2cSJim Jagielski       mpText (NULL),
149*b1cdbd2cSJim Jagielski       mpParent (NULL)
150*b1cdbd2cSJim Jagielski {
151*b1cdbd2cSJim Jagielski 	m_pShape = GetSdrObjectFromXShape(mxShape);
152*b1cdbd2cSJim Jagielski }
~AccessibleShape(void)153*b1cdbd2cSJim Jagielski AccessibleShape::~AccessibleShape (void)
154*b1cdbd2cSJim Jagielski {
155*b1cdbd2cSJim Jagielski     if (mpChildrenManager != NULL)
156*b1cdbd2cSJim Jagielski         delete mpChildrenManager;
157*b1cdbd2cSJim Jagielski     if (mpText != NULL)
158*b1cdbd2cSJim Jagielski         delete mpText;
159*b1cdbd2cSJim Jagielski     OSL_TRACE ("~AccessibleShape");
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski     // Unregistering from the various broadcasters should be unnecessary
162*b1cdbd2cSJim Jagielski     // since this destructor would not have been called if one of the
163*b1cdbd2cSJim Jagielski     // broadcasters would still hold a strong reference to this object.
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 
Init(void)169*b1cdbd2cSJim Jagielski void AccessibleShape::Init (void)
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski     // Update the OPAQUE and SELECTED shape.
172*b1cdbd2cSJim Jagielski     UpdateStates ();
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski     // Create a children manager when this shape has children of its own.
175*b1cdbd2cSJim Jagielski     Reference<drawing::XShapes> xShapes (mxShape, uno::UNO_QUERY);
176*b1cdbd2cSJim Jagielski     if (xShapes.is() && xShapes->getCount() > 0)
177*b1cdbd2cSJim Jagielski         mpChildrenManager = new ChildrenManager (
178*b1cdbd2cSJim Jagielski             this, xShapes, maShapeTreeInfo, *this);
179*b1cdbd2cSJim Jagielski     if (mpChildrenManager != NULL)
180*b1cdbd2cSJim Jagielski         mpChildrenManager->Update();
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski     // Register at model as document::XEventListener.
183*b1cdbd2cSJim Jagielski     if (maShapeTreeInfo.GetModelBroadcaster().is())
184*b1cdbd2cSJim Jagielski         maShapeTreeInfo.GetModelBroadcaster()->addEventListener (
185*b1cdbd2cSJim Jagielski             static_cast<document::XEventListener*>(this));
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     // Beware! Here we leave the paths of the UNO API and descend into the
188*b1cdbd2cSJim Jagielski     // depths of the core.  Necessary for makeing the edit engine
189*b1cdbd2cSJim Jagielski     // accessible.
190*b1cdbd2cSJim Jagielski     Reference<text::XText> xText (mxShape, uno::UNO_QUERY);
191*b1cdbd2cSJim Jagielski     if (xText.is())
192*b1cdbd2cSJim Jagielski     {
193*b1cdbd2cSJim Jagielski         SdrView* pView = maShapeTreeInfo.GetSdrView ();
194*b1cdbd2cSJim Jagielski         const Window* pWindow = maShapeTreeInfo.GetWindow ();
195*b1cdbd2cSJim Jagielski         if (pView != NULL && pWindow != NULL && mxShape.is())
196*b1cdbd2cSJim Jagielski         {
197*b1cdbd2cSJim Jagielski             // #107948# Determine whether shape text is empty
198*b1cdbd2cSJim Jagielski             SdrObject* pSdrObject = GetSdrObjectFromXShape(mxShape);
199*b1cdbd2cSJim Jagielski 			if( pSdrObject )
200*b1cdbd2cSJim Jagielski 			{
201*b1cdbd2cSJim Jagielski                 SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, pSdrObject );
202*b1cdbd2cSJim Jagielski                 OutlinerParaObject* pOutlinerParaObject = NULL;
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski                 if( pTextObj )
205*b1cdbd2cSJim Jagielski                     pOutlinerParaObject = pTextObj->GetEditOutlinerParaObject(); // Get the OutlinerParaObject if text edit is active
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski                 bool bOwnParaObj = pOutlinerParaObject != NULL;
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski                 if( !pOutlinerParaObject && pSdrObject )
210*b1cdbd2cSJim Jagielski                     pOutlinerParaObject = pSdrObject->GetOutlinerParaObject();
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski                 // create AccessibleTextHelper to handle this shape's text
213*b1cdbd2cSJim Jagielski                 if( !pOutlinerParaObject )
214*b1cdbd2cSJim Jagielski                 {
215*b1cdbd2cSJim Jagielski                     // empty text -> use proxy edit source to delay creation of EditEngine
216*b1cdbd2cSJim Jagielski                     ::std::auto_ptr<SvxEditSource> pEditSource( new AccessibleEmptyEditSource ( *pSdrObject, *pView, *pWindow) );
217*b1cdbd2cSJim Jagielski                     mpText = new AccessibleTextHelper( pEditSource );
218*b1cdbd2cSJim Jagielski                 }
219*b1cdbd2cSJim Jagielski                 else
220*b1cdbd2cSJim Jagielski                 {
221*b1cdbd2cSJim Jagielski                     // non-empty text -> use full-fledged edit source right away
222*b1cdbd2cSJim Jagielski                     ::std::auto_ptr<SvxEditSource> pEditSource( new SvxTextEditSource ( *pSdrObject, 0, *pView, *pWindow) );
223*b1cdbd2cSJim Jagielski                     mpText = new AccessibleTextHelper( pEditSource );
224*b1cdbd2cSJim Jagielski                 }
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski                 if( bOwnParaObj )
227*b1cdbd2cSJim Jagielski                     delete pOutlinerParaObject;
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski                 mpText->SetEventSource(this);
230*b1cdbd2cSJim Jagielski             }
231*b1cdbd2cSJim Jagielski         }
232*b1cdbd2cSJim Jagielski     }
233*b1cdbd2cSJim Jagielski }
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 
UpdateStates(void)238*b1cdbd2cSJim Jagielski void AccessibleShape::UpdateStates (void)
239*b1cdbd2cSJim Jagielski {
240*b1cdbd2cSJim Jagielski     ::utl::AccessibleStateSetHelper* pStateSet =
241*b1cdbd2cSJim Jagielski         static_cast< ::utl::AccessibleStateSetHelper*>(mxStateSet.get());
242*b1cdbd2cSJim Jagielski     if (pStateSet == NULL)
243*b1cdbd2cSJim Jagielski         return;
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski     // Set the opaque state for certain shape types when their fill style is
246*b1cdbd2cSJim Jagielski     // solid.
247*b1cdbd2cSJim Jagielski     bool bShapeIsOpaque = false;
248*b1cdbd2cSJim Jagielski     switch (ShapeTypeHandler::Instance().GetTypeId (mxShape))
249*b1cdbd2cSJim Jagielski     {
250*b1cdbd2cSJim Jagielski         case DRAWING_PAGE:
251*b1cdbd2cSJim Jagielski         case DRAWING_RECTANGLE:
252*b1cdbd2cSJim Jagielski         case DRAWING_TEXT:
253*b1cdbd2cSJim Jagielski         {
254*b1cdbd2cSJim Jagielski             uno::Reference<beans::XPropertySet> xSet (mxShape, uno::UNO_QUERY);
255*b1cdbd2cSJim Jagielski             if (xSet.is())
256*b1cdbd2cSJim Jagielski             {
257*b1cdbd2cSJim Jagielski                 try
258*b1cdbd2cSJim Jagielski                 {
259*b1cdbd2cSJim Jagielski 					drawing::FillStyle aFillStyle;
260*b1cdbd2cSJim Jagielski 					bShapeIsOpaque =  ( xSet->getPropertyValue (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle"))) >>= aFillStyle)
261*b1cdbd2cSJim Jagielski 										&& aFillStyle == drawing::FillStyle_SOLID;
262*b1cdbd2cSJim Jagielski                 }
263*b1cdbd2cSJim Jagielski                 catch (::com::sun::star::beans::UnknownPropertyException&)
264*b1cdbd2cSJim Jagielski                 {
265*b1cdbd2cSJim Jagielski                     // Ignore.
266*b1cdbd2cSJim Jagielski                 }
267*b1cdbd2cSJim Jagielski             }
268*b1cdbd2cSJim Jagielski         }
269*b1cdbd2cSJim Jagielski     }
270*b1cdbd2cSJim Jagielski     if (bShapeIsOpaque)
271*b1cdbd2cSJim Jagielski         pStateSet->AddState (AccessibleStateType::OPAQUE);
272*b1cdbd2cSJim Jagielski     else
273*b1cdbd2cSJim Jagielski         pStateSet->RemoveState (AccessibleStateType::OPAQUE);
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski     // Set the selected state.
276*b1cdbd2cSJim Jagielski     bool bShapeIsSelected = false;
277*b1cdbd2cSJim Jagielski 	// XXX fix_me this has to be done with an extra interface later on
278*b1cdbd2cSJim Jagielski 	if ( m_pShape && maShapeTreeInfo.GetSdrView() )
279*b1cdbd2cSJim Jagielski 	{
280*b1cdbd2cSJim Jagielski 		bShapeIsSelected = maShapeTreeInfo.GetSdrView()->IsObjMarked(m_pShape) == sal_True;
281*b1cdbd2cSJim Jagielski 	}
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski     if (bShapeIsSelected)
284*b1cdbd2cSJim Jagielski         pStateSet->AddState (AccessibleStateType::SELECTED);
285*b1cdbd2cSJim Jagielski     else
286*b1cdbd2cSJim Jagielski         pStateSet->RemoveState (AccessibleStateType::SELECTED);
287*b1cdbd2cSJim Jagielski }
GetStyle()288*b1cdbd2cSJim Jagielski     ::rtl::OUString AccessibleShape::GetStyle()
289*b1cdbd2cSJim Jagielski     {
290*b1cdbd2cSJim Jagielski 	    return ShapeTypeHandler::CreateAccessibleBaseName( mxShape );
291*b1cdbd2cSJim Jagielski     }
292*b1cdbd2cSJim Jagielski 
operator ==(const AccessibleShape & rShape)293*b1cdbd2cSJim Jagielski bool AccessibleShape::operator== (const AccessibleShape& rShape)
294*b1cdbd2cSJim Jagielski {
295*b1cdbd2cSJim Jagielski     return this==&rShape;
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski 
SetState(sal_Int16 aState)301*b1cdbd2cSJim Jagielski sal_Bool AccessibleShape::SetState (sal_Int16 aState)
302*b1cdbd2cSJim Jagielski {
303*b1cdbd2cSJim Jagielski     sal_Bool bStateHasChanged = sal_False;
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski     if (aState == AccessibleStateType::FOCUSED && mpText != NULL)
306*b1cdbd2cSJim Jagielski     {
307*b1cdbd2cSJim Jagielski         // Offer FOCUSED state to edit engine and detect whether the state
308*b1cdbd2cSJim Jagielski         // changes.
309*b1cdbd2cSJim Jagielski         sal_Bool bIsFocused = mpText->HaveFocus ();
310*b1cdbd2cSJim Jagielski         mpText->SetFocus (sal_True);
311*b1cdbd2cSJim Jagielski         bStateHasChanged = (bIsFocused != mpText->HaveFocus ());
312*b1cdbd2cSJim Jagielski     }
313*b1cdbd2cSJim Jagielski     else
314*b1cdbd2cSJim Jagielski         bStateHasChanged = AccessibleContextBase::SetState (aState);
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski     return bStateHasChanged;
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski 
ResetState(sal_Int16 aState)322*b1cdbd2cSJim Jagielski sal_Bool AccessibleShape::ResetState (sal_Int16 aState)
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski     sal_Bool bStateHasChanged = sal_False;
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski     if (aState == AccessibleStateType::FOCUSED && mpText != NULL)
327*b1cdbd2cSJim Jagielski     {
328*b1cdbd2cSJim Jagielski         // Try to remove FOCUSED state from the edit engine and detect
329*b1cdbd2cSJim Jagielski         // whether the state changes.
330*b1cdbd2cSJim Jagielski         sal_Bool bIsFocused = mpText->HaveFocus ();
331*b1cdbd2cSJim Jagielski         mpText->SetFocus (sal_False);
332*b1cdbd2cSJim Jagielski         bStateHasChanged = (bIsFocused != mpText->HaveFocus ());
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski     else
335*b1cdbd2cSJim Jagielski         bStateHasChanged = AccessibleContextBase::ResetState (aState);
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski     return bStateHasChanged;
338*b1cdbd2cSJim Jagielski }
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 
GetState(sal_Int16 aState)343*b1cdbd2cSJim Jagielski sal_Bool AccessibleShape::GetState (sal_Int16 aState)
344*b1cdbd2cSJim Jagielski {
345*b1cdbd2cSJim Jagielski     if (aState == AccessibleStateType::FOCUSED && mpText != NULL)
346*b1cdbd2cSJim Jagielski     {
347*b1cdbd2cSJim Jagielski         // Just delegate the call to the edit engine.  The state is not
348*b1cdbd2cSJim Jagielski         // merged into the state set.
349*b1cdbd2cSJim Jagielski         return mpText->HaveFocus();
350*b1cdbd2cSJim Jagielski     }
351*b1cdbd2cSJim Jagielski     else
352*b1cdbd2cSJim Jagielski         return AccessibleContextBase::GetState (aState);
353*b1cdbd2cSJim Jagielski }
354*b1cdbd2cSJim Jagielski // Solution: OverWrite the parent's getAccessibleName method
getAccessibleName(void)355*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL AccessibleShape::getAccessibleName (void)
356*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
357*b1cdbd2cSJim Jagielski {
358*b1cdbd2cSJim Jagielski     	ThrowIfDisposed ();
359*b1cdbd2cSJim Jagielski 	if( m_pShape && m_pShape->GetTitle().Len() > 0)
360*b1cdbd2cSJim Jagielski 		return CreateAccessibleName() + ::rtl::OUString(' ') + m_pShape->GetTitle();
361*b1cdbd2cSJim Jagielski 	else
362*b1cdbd2cSJim Jagielski 		return CreateAccessibleName();
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski 
getAccessibleDescription(void)365*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL AccessibleShape::getAccessibleDescription (void)
366*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski     	ThrowIfDisposed ();
369*b1cdbd2cSJim Jagielski 	if( m_pShape && m_pShape->GetDescription().Len() > 0)
370*b1cdbd2cSJim Jagielski 		return	m_pShape->GetDescription() ;
371*b1cdbd2cSJim Jagielski 	else
372*b1cdbd2cSJim Jagielski 		return OUString( RTL_CONSTASCII_USTRINGPARAM( " " ));
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski //=====  XAccessibleContext  ==================================================
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski /** The children of this shape come from two sources: The children from
377*b1cdbd2cSJim Jagielski     group or scene shapes and the paragraphs of text.
378*b1cdbd2cSJim Jagielski */
379*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL
getAccessibleChildCount()380*b1cdbd2cSJim Jagielski    	AccessibleShape::getAccessibleChildCount ()
381*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
382*b1cdbd2cSJim Jagielski {
383*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
384*b1cdbd2cSJim Jagielski     sal_Int32 nChildCount = 0;
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     // Add the number of shapes that are children of this shape.
387*b1cdbd2cSJim Jagielski     if (mpChildrenManager != NULL)
388*b1cdbd2cSJim Jagielski         nChildCount += mpChildrenManager->GetChildCount ();
389*b1cdbd2cSJim Jagielski     // Add the number text paragraphs.
390*b1cdbd2cSJim Jagielski     if (mpText != NULL)
391*b1cdbd2cSJim Jagielski         nChildCount += mpText->GetChildCount ();
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski     return nChildCount;
394*b1cdbd2cSJim Jagielski }
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski /** Forward the request to the shape.  Return the requested shape or throw
400*b1cdbd2cSJim Jagielski     an exception for a wrong index.
401*b1cdbd2cSJim Jagielski */
402*b1cdbd2cSJim Jagielski uno::Reference<XAccessible> SAL_CALL
getAccessibleChild(sal_Int32 nIndex)403*b1cdbd2cSJim Jagielski     AccessibleShape::getAccessibleChild (sal_Int32 nIndex)
404*b1cdbd2cSJim Jagielski     throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski     uno::Reference<XAccessible> xChild;
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski     // Depending on the index decide whether to delegate this call to the
411*b1cdbd2cSJim Jagielski     // children manager or the edit engine.
412*b1cdbd2cSJim Jagielski     if ((mpChildrenManager != NULL)
413*b1cdbd2cSJim Jagielski         && (nIndex < mpChildrenManager->GetChildCount()))
414*b1cdbd2cSJim Jagielski     {
415*b1cdbd2cSJim Jagielski         xChild = mpChildrenManager->GetChild (nIndex);
416*b1cdbd2cSJim Jagielski     }
417*b1cdbd2cSJim Jagielski     else if (mpText != NULL)
418*b1cdbd2cSJim Jagielski     {
419*b1cdbd2cSJim Jagielski         sal_Int32 nI = nIndex;
420*b1cdbd2cSJim Jagielski         if (mpChildrenManager != NULL)
421*b1cdbd2cSJim Jagielski             nI -= mpChildrenManager->GetChildCount();
422*b1cdbd2cSJim Jagielski         xChild = mpText->GetChild (nI);
423*b1cdbd2cSJim Jagielski     }
424*b1cdbd2cSJim Jagielski     else
425*b1cdbd2cSJim Jagielski         throw lang::IndexOutOfBoundsException (
426*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii ("shape has no child with index ")
427*b1cdbd2cSJim Jagielski             + rtl::OUString::valueOf(nIndex),
428*b1cdbd2cSJim Jagielski             static_cast<uno::XWeak*>(this));
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski     return xChild;
431*b1cdbd2cSJim Jagielski }
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski uno::Reference<XAccessibleRelationSet> SAL_CALL
getAccessibleRelationSet(void)434*b1cdbd2cSJim Jagielski     AccessibleShape::getAccessibleRelationSet (void)
435*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException)
436*b1cdbd2cSJim Jagielski {
437*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
438*b1cdbd2cSJim Jagielski     ::utl::AccessibleRelationSetHelper* pRelationSet = new utl::AccessibleRelationSetHelper;
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski     //this mxshape is the captioned shape, only for sw
441*b1cdbd2cSJim Jagielski     if (pRelationSet != NULL)
442*b1cdbd2cSJim Jagielski     {
443*b1cdbd2cSJim Jagielski 		uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1);
444*b1cdbd2cSJim Jagielski 		aSequence[0] = mpParent->GetAccessibleCaption(mxShape);
445*b1cdbd2cSJim Jagielski 		if(aSequence[0].get())
446*b1cdbd2cSJim Jagielski 		{
447*b1cdbd2cSJim Jagielski 			pRelationSet->AddRelation(
448*b1cdbd2cSJim Jagielski 				AccessibleRelation( AccessibleRelationType::DESCRIBED_BY, aSequence ) );
449*b1cdbd2cSJim Jagielski 		}
450*b1cdbd2cSJim Jagielski         return uno::Reference<XAccessibleRelationSet> (
451*b1cdbd2cSJim Jagielski             new ::utl::AccessibleRelationSetHelper (*pRelationSet));
452*b1cdbd2cSJim Jagielski     }
453*b1cdbd2cSJim Jagielski     else
454*b1cdbd2cSJim Jagielski     {
455*b1cdbd2cSJim Jagielski         return uno::Reference<XAccessibleRelationSet>(NULL);
456*b1cdbd2cSJim Jagielski     }
457*b1cdbd2cSJim Jagielski }
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski /**	Return a copy of the state set.
460*b1cdbd2cSJim Jagielski     Possible states are:
461*b1cdbd2cSJim Jagielski 		ENABLED
462*b1cdbd2cSJim Jagielski 		SHOWING
463*b1cdbd2cSJim Jagielski 		VISIBLE
464*b1cdbd2cSJim Jagielski */
465*b1cdbd2cSJim Jagielski uno::Reference<XAccessibleStateSet> SAL_CALL
getAccessibleStateSet(void)466*b1cdbd2cSJim Jagielski     AccessibleShape::getAccessibleStateSet (void)
467*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
470*b1cdbd2cSJim Jagielski     Reference<XAccessibleStateSet> xStateSet;
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski 	if (rBHelper.bDisposed || mpText == NULL)
473*b1cdbd2cSJim Jagielski         // Return a minimal state set that only contains the DEFUNC state.
474*b1cdbd2cSJim Jagielski 	{
475*b1cdbd2cSJim Jagielski         xStateSet = AccessibleContextBase::getAccessibleStateSet ();
476*b1cdbd2cSJim Jagielski 		::utl::AccessibleStateSetHelper* pStateSet =
477*b1cdbd2cSJim Jagielski               static_cast< ::utl::AccessibleStateSetHelper*>(mxStateSet.get());
478*b1cdbd2cSJim Jagielski 		    ::com::sun::star::uno::Reference<XAccessible> xTempAcc = getAccessibleParent();
479*b1cdbd2cSJim Jagielski 		    if( xTempAcc.is() )
480*b1cdbd2cSJim Jagielski 		    {
481*b1cdbd2cSJim Jagielski 		    	::com::sun::star::uno::Reference<XAccessibleContext>
482*b1cdbd2cSJim Jagielski 		    							xTempAccContext = xTempAcc->getAccessibleContext();
483*b1cdbd2cSJim Jagielski 		    	if( xTempAccContext.is() )
484*b1cdbd2cSJim Jagielski 		    	{
485*b1cdbd2cSJim Jagielski 		    		::com::sun::star::uno::Reference<XAccessibleStateSet> rState =
486*b1cdbd2cSJim Jagielski 		    			xTempAccContext->getAccessibleStateSet();
487*b1cdbd2cSJim Jagielski 		    		if( rState.is() )    		{
488*b1cdbd2cSJim Jagielski 						com::sun::star::uno::Sequence<short> pStates = rState->getStates();
489*b1cdbd2cSJim Jagielski 						int count = pStates.getLength();
490*b1cdbd2cSJim Jagielski 						for( int iIndex = 0;iIndex < count;iIndex++ )
491*b1cdbd2cSJim Jagielski 						{
492*b1cdbd2cSJim Jagielski 							if( pStates[iIndex] == AccessibleStateType::EDITABLE )
493*b1cdbd2cSJim Jagielski 							{
494*b1cdbd2cSJim Jagielski 								pStateSet->AddState (AccessibleStateType::EDITABLE);
495*b1cdbd2cSJim Jagielski 							    pStateSet->AddState (AccessibleStateType::RESIZABLE);
496*b1cdbd2cSJim Jagielski 							    pStateSet->AddState (AccessibleStateType::MOVEABLE);
497*b1cdbd2cSJim Jagielski 								break;
498*b1cdbd2cSJim Jagielski 							}
499*b1cdbd2cSJim Jagielski 						}
500*b1cdbd2cSJim Jagielski 					}
501*b1cdbd2cSJim Jagielski 				}
502*b1cdbd2cSJim Jagielski 		    }
503*b1cdbd2cSJim Jagielski 			xStateSet = Reference<XAccessibleStateSet>(
504*b1cdbd2cSJim Jagielski                 new ::utl::AccessibleStateSetHelper (*pStateSet));
505*b1cdbd2cSJim Jagielski     }else
506*b1cdbd2cSJim Jagielski     {
507*b1cdbd2cSJim Jagielski         ::utl::AccessibleStateSetHelper* pStateSet =
508*b1cdbd2cSJim Jagielski               static_cast< ::utl::AccessibleStateSetHelper*>(mxStateSet.get());
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski         if (pStateSet != NULL)
511*b1cdbd2cSJim Jagielski         {
512*b1cdbd2cSJim Jagielski             // Merge current FOCUSED state from edit engine.
513*b1cdbd2cSJim Jagielski             if (mpText != NULL)
514*b1cdbd2cSJim Jagielski             {
515*b1cdbd2cSJim Jagielski                 if (mpText->HaveFocus())
516*b1cdbd2cSJim Jagielski                     pStateSet->AddState (AccessibleStateType::FOCUSED);
517*b1cdbd2cSJim Jagielski                 else
518*b1cdbd2cSJim Jagielski                     pStateSet->RemoveState (AccessibleStateType::FOCUSED);
519*b1cdbd2cSJim Jagielski             }
520*b1cdbd2cSJim Jagielski 			//Solution:Just when the document is not read-only,set states EDITABLE,RESIZABLE,MOVEABLE
521*b1cdbd2cSJim Jagielski 		    ::com::sun::star::uno::Reference<XAccessible> xTempAcc = getAccessibleParent();
522*b1cdbd2cSJim Jagielski 		    if( xTempAcc.is() )
523*b1cdbd2cSJim Jagielski 		    {
524*b1cdbd2cSJim Jagielski 		    	::com::sun::star::uno::Reference<XAccessibleContext>
525*b1cdbd2cSJim Jagielski 		    							xTempAccContext = xTempAcc->getAccessibleContext();
526*b1cdbd2cSJim Jagielski 		    	if( xTempAccContext.is() )
527*b1cdbd2cSJim Jagielski 		    	{
528*b1cdbd2cSJim Jagielski 		    		::com::sun::star::uno::Reference<XAccessibleStateSet> rState =
529*b1cdbd2cSJim Jagielski 		    			xTempAccContext->getAccessibleStateSet();
530*b1cdbd2cSJim Jagielski 		    		if( rState.is() )    		{
531*b1cdbd2cSJim Jagielski 						com::sun::star::uno::Sequence<short> pStates = rState->getStates();
532*b1cdbd2cSJim Jagielski 						int count = pStates.getLength();
533*b1cdbd2cSJim Jagielski 						for( int iIndex = 0;iIndex < count;iIndex++ )
534*b1cdbd2cSJim Jagielski 						{
535*b1cdbd2cSJim Jagielski 							if( pStates[iIndex] == AccessibleStateType::EDITABLE )
536*b1cdbd2cSJim Jagielski 							{
537*b1cdbd2cSJim Jagielski 								pStateSet->AddState (AccessibleStateType::EDITABLE);
538*b1cdbd2cSJim Jagielski 							    pStateSet->AddState (AccessibleStateType::RESIZABLE);
539*b1cdbd2cSJim Jagielski 							    pStateSet->AddState (AccessibleStateType::MOVEABLE);
540*b1cdbd2cSJim Jagielski 								break;
541*b1cdbd2cSJim Jagielski 							}
542*b1cdbd2cSJim Jagielski 						}
543*b1cdbd2cSJim Jagielski 					}
544*b1cdbd2cSJim Jagielski 				}
545*b1cdbd2cSJim Jagielski 		    }
546*b1cdbd2cSJim Jagielski             // Create a copy of the state set that may be modified by the
547*b1cdbd2cSJim Jagielski             // caller without affecting the current state set.
548*b1cdbd2cSJim Jagielski             xStateSet = Reference<XAccessibleStateSet>(
549*b1cdbd2cSJim Jagielski                 new ::utl::AccessibleStateSetHelper (*pStateSet));
550*b1cdbd2cSJim Jagielski         }
551*b1cdbd2cSJim Jagielski     }
552*b1cdbd2cSJim Jagielski 	UpdateDocumentAllSelState(xStateSet);
553*b1cdbd2cSJim Jagielski     return xStateSet;
554*b1cdbd2cSJim Jagielski }
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski //=====  XAccessibleComponent  ================================================
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski /** The implementation below is at the moment straightforward.  It iterates
562*b1cdbd2cSJim Jagielski     over all children (and thereby instances all children which have not
563*b1cdbd2cSJim Jagielski     been already instatiated) until a child covering the specifed point is
564*b1cdbd2cSJim Jagielski     found.
565*b1cdbd2cSJim Jagielski     This leaves room for improvement.  For instance, first iterate only over
566*b1cdbd2cSJim Jagielski     the already instantiated children and only if no match is found
567*b1cdbd2cSJim Jagielski     instantiate the remaining ones.
568*b1cdbd2cSJim Jagielski */
569*b1cdbd2cSJim Jagielski uno::Reference<XAccessible > SAL_CALL
getAccessibleAtPoint(const awt::Point & aPoint)570*b1cdbd2cSJim Jagielski     AccessibleShape::getAccessibleAtPoint (
571*b1cdbd2cSJim Jagielski         const awt::Point& aPoint)
572*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
573*b1cdbd2cSJim Jagielski {
574*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski     sal_Int32 nChildCount = getAccessibleChildCount ();
577*b1cdbd2cSJim Jagielski     for (sal_Int32 i=0; i<nChildCount; ++i)
578*b1cdbd2cSJim Jagielski     {
579*b1cdbd2cSJim Jagielski         Reference<XAccessible> xChild (getAccessibleChild (i));
580*b1cdbd2cSJim Jagielski         if (xChild.is())
581*b1cdbd2cSJim Jagielski         {
582*b1cdbd2cSJim Jagielski             Reference<XAccessibleComponent> xChildComponent (
583*b1cdbd2cSJim Jagielski                 xChild->getAccessibleContext(), uno::UNO_QUERY);
584*b1cdbd2cSJim Jagielski             if (xChildComponent.is())
585*b1cdbd2cSJim Jagielski             {
586*b1cdbd2cSJim Jagielski                 awt::Rectangle aBBox (xChildComponent->getBounds());
587*b1cdbd2cSJim Jagielski                 if ( (aPoint.X >= aBBox.X)
588*b1cdbd2cSJim Jagielski                     && (aPoint.Y >= aBBox.Y)
589*b1cdbd2cSJim Jagielski                     && (aPoint.X < aBBox.X+aBBox.Width)
590*b1cdbd2cSJim Jagielski                     && (aPoint.Y < aBBox.Y+aBBox.Height) )
591*b1cdbd2cSJim Jagielski                     return xChild;
592*b1cdbd2cSJim Jagielski             }
593*b1cdbd2cSJim Jagielski         }
594*b1cdbd2cSJim Jagielski     }
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski     // Have not found a child under the given point.  Returning empty
597*b1cdbd2cSJim Jagielski     // reference to indicate this.
598*b1cdbd2cSJim Jagielski     return uno::Reference<XAccessible>();
599*b1cdbd2cSJim Jagielski }
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 
getBounds(void)604*b1cdbd2cSJim Jagielski awt::Rectangle SAL_CALL AccessibleShape::getBounds (void)
605*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
606*b1cdbd2cSJim Jagielski {
607*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
608*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
609*b1cdbd2cSJim Jagielski 
610*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
611*b1cdbd2cSJim Jagielski 	awt::Rectangle aBoundingBox;
612*b1cdbd2cSJim Jagielski 	if ( mxShape.is() )
613*b1cdbd2cSJim Jagielski 	{
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski 		static const OUString sBoundRectName (
616*b1cdbd2cSJim Jagielski 			RTL_CONSTASCII_USTRINGPARAM("BoundRect"));
617*b1cdbd2cSJim Jagielski 		static const OUString sAnchorPositionName (
618*b1cdbd2cSJim Jagielski 			RTL_CONSTASCII_USTRINGPARAM("AnchorPosition"));
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 		// Get the shape's bounding box in internal coordinates (in 100th of
621*b1cdbd2cSJim Jagielski 		// mm).  Use the property BoundRect.  Only if that is not supported ask
622*b1cdbd2cSJim Jagielski 		// the shape for its position and size directly.
623*b1cdbd2cSJim Jagielski 		Reference<beans::XPropertySet> xSet (mxShape, uno::UNO_QUERY);
624*b1cdbd2cSJim Jagielski 		Reference<beans::XPropertySetInfo> xSetInfo;
625*b1cdbd2cSJim Jagielski 		bool bFoundBoundRect = false;
626*b1cdbd2cSJim Jagielski 		if (xSet.is())
627*b1cdbd2cSJim Jagielski 		{
628*b1cdbd2cSJim Jagielski 			xSetInfo = xSet->getPropertySetInfo ();
629*b1cdbd2cSJim Jagielski 			if (xSetInfo.is())
630*b1cdbd2cSJim Jagielski 			{
631*b1cdbd2cSJim Jagielski 				if (xSetInfo->hasPropertyByName (sBoundRectName))
632*b1cdbd2cSJim Jagielski 				{
633*b1cdbd2cSJim Jagielski 					try
634*b1cdbd2cSJim Jagielski 					{
635*b1cdbd2cSJim Jagielski 						uno::Any aValue = xSet->getPropertyValue (sBoundRectName);
636*b1cdbd2cSJim Jagielski 						aValue >>= aBoundingBox;
637*b1cdbd2cSJim Jagielski 						bFoundBoundRect = true;
638*b1cdbd2cSJim Jagielski 					}
639*b1cdbd2cSJim Jagielski 					catch (beans::UnknownPropertyException e)
640*b1cdbd2cSJim Jagielski 					{
641*b1cdbd2cSJim Jagielski 						// Handled below (bFoundBoundRect stays false).
642*b1cdbd2cSJim Jagielski 					}
643*b1cdbd2cSJim Jagielski 				}
644*b1cdbd2cSJim Jagielski 				else
645*b1cdbd2cSJim Jagielski 					OSL_TRACE (" no property BoundRect");
646*b1cdbd2cSJim Jagielski 			}
647*b1cdbd2cSJim Jagielski 		}
648*b1cdbd2cSJim Jagielski 
649*b1cdbd2cSJim Jagielski 		// Fallback when there is no BoundRect Property.
650*b1cdbd2cSJim Jagielski 		if ( ! bFoundBoundRect )
651*b1cdbd2cSJim Jagielski 		{
652*b1cdbd2cSJim Jagielski 			awt::Point aPosition (mxShape->getPosition());
653*b1cdbd2cSJim Jagielski 			awt::Size aSize (mxShape->getSize());
654*b1cdbd2cSJim Jagielski 			aBoundingBox = awt::Rectangle (
655*b1cdbd2cSJim Jagielski 				aPosition.X, aPosition.Y,
656*b1cdbd2cSJim Jagielski 				aSize.Width, aSize.Height);
657*b1cdbd2cSJim Jagielski 
658*b1cdbd2cSJim Jagielski 			// While BoundRects have absolute positions, the position returned
659*b1cdbd2cSJim Jagielski 			// by XPosition::getPosition is relative.  Get the anchor position
660*b1cdbd2cSJim Jagielski 			// (usually not (0,0) for Writer shapes).
661*b1cdbd2cSJim Jagielski 			if (xSetInfo.is())
662*b1cdbd2cSJim Jagielski 			{
663*b1cdbd2cSJim Jagielski 				if (xSetInfo->hasPropertyByName (sAnchorPositionName))
664*b1cdbd2cSJim Jagielski 				{
665*b1cdbd2cSJim Jagielski 					uno::Any aPos = xSet->getPropertyValue (sAnchorPositionName);
666*b1cdbd2cSJim Jagielski 					awt::Point aAnchorPosition;
667*b1cdbd2cSJim Jagielski 					aPos >>= aAnchorPosition;
668*b1cdbd2cSJim Jagielski 					aBoundingBox.X += aAnchorPosition.X;
669*b1cdbd2cSJim Jagielski 					aBoundingBox.Y += aAnchorPosition.Y;
670*b1cdbd2cSJim Jagielski 				}
671*b1cdbd2cSJim Jagielski 			}
672*b1cdbd2cSJim Jagielski 		}
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 		// Transform coordinates from internal to pixel.
675*b1cdbd2cSJim Jagielski 		if (maShapeTreeInfo.GetViewForwarder() == NULL)
676*b1cdbd2cSJim Jagielski 			throw uno::RuntimeException (::rtl::OUString (
677*b1cdbd2cSJim Jagielski 				RTL_CONSTASCII_USTRINGPARAM(
678*b1cdbd2cSJim Jagielski 					"AccessibleShape has no valid view forwarder")),
679*b1cdbd2cSJim Jagielski 				static_cast<uno::XWeak*>(this));
680*b1cdbd2cSJim Jagielski 		::Size aPixelSize = maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
681*b1cdbd2cSJim Jagielski 			::Size (aBoundingBox.Width, aBoundingBox.Height));
682*b1cdbd2cSJim Jagielski 		::Point aPixelPosition = maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
683*b1cdbd2cSJim Jagielski 			::Point (aBoundingBox.X, aBoundingBox.Y));
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski 		// Clip the shape's bounding box with the bounding box of its parent.
686*b1cdbd2cSJim Jagielski 		Reference<XAccessibleComponent> xParentComponent (
687*b1cdbd2cSJim Jagielski 			getAccessibleParent(), uno::UNO_QUERY);
688*b1cdbd2cSJim Jagielski 		if (xParentComponent.is())
689*b1cdbd2cSJim Jagielski 		{
690*b1cdbd2cSJim Jagielski 			// Make the coordinates relative to the parent.
691*b1cdbd2cSJim Jagielski 			awt::Point aParentLocation (xParentComponent->getLocationOnScreen());
692*b1cdbd2cSJim Jagielski 			int x = aPixelPosition.getX() - aParentLocation.X;
693*b1cdbd2cSJim Jagielski 			int y = aPixelPosition.getY() - aParentLocation.Y;
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski 			/*        //  The following block is a workarround for bug #99889# (property
696*b1cdbd2cSJim Jagielski 			//  BoundRect returnes coordinates relative to document window
697*b1cdbd2cSJim Jagielski 			//  instead of absolute coordinates for shapes in Writer).  Has to
698*b1cdbd2cSJim Jagielski 			//  be removed as soon as bug is fixed.
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski 			// Use a non-null anchor position as flag that the shape is in a
701*b1cdbd2cSJim Jagielski 			// Writer document.
702*b1cdbd2cSJim Jagielski 			if (xSetInfo.is())
703*b1cdbd2cSJim Jagielski 				if (xSetInfo->hasPropertyByName (sAnchorPositionName))
704*b1cdbd2cSJim Jagielski 				{
705*b1cdbd2cSJim Jagielski 					uno::Any aPos = xSet->getPropertyValue (sAnchorPositionName);
706*b1cdbd2cSJim Jagielski 					awt::Point aAnchorPosition;
707*b1cdbd2cSJim Jagielski 					aPos >>= aAnchorPosition;
708*b1cdbd2cSJim Jagielski 					if (aAnchorPosition.X > 0)
709*b1cdbd2cSJim Jagielski 					{
710*b1cdbd2cSJim Jagielski 						x = aPixelPosition.getX();
711*b1cdbd2cSJim Jagielski 						y = aPixelPosition.getY();
712*b1cdbd2cSJim Jagielski 					}
713*b1cdbd2cSJim Jagielski 				}
714*b1cdbd2cSJim Jagielski 			//  End of workarround.
715*b1cdbd2cSJim Jagielski 			*/
716*b1cdbd2cSJim Jagielski 			// Clip with parent (with coordinates relative to itself).
717*b1cdbd2cSJim Jagielski 			::Rectangle aBBox (
718*b1cdbd2cSJim Jagielski 				x, y, x + aPixelSize.getWidth(), y + aPixelSize.getHeight());
719*b1cdbd2cSJim Jagielski 			awt::Size aParentSize (xParentComponent->getSize());
720*b1cdbd2cSJim Jagielski 			::Rectangle aParentBBox (0,0, aParentSize.Width, aParentSize.Height);
721*b1cdbd2cSJim Jagielski 			aBBox = aBBox.GetIntersection (aParentBBox);
722*b1cdbd2cSJim Jagielski 			aBoundingBox = awt::Rectangle (
723*b1cdbd2cSJim Jagielski 				aBBox.getX(),
724*b1cdbd2cSJim Jagielski 				aBBox.getY(),
725*b1cdbd2cSJim Jagielski 				aBBox.getWidth(),
726*b1cdbd2cSJim Jagielski 				aBBox.getHeight());
727*b1cdbd2cSJim Jagielski 		}
728*b1cdbd2cSJim Jagielski 		else
729*b1cdbd2cSJim Jagielski 		{
730*b1cdbd2cSJim Jagielski 			OSL_TRACE ("parent does not support component");
731*b1cdbd2cSJim Jagielski 			aBoundingBox = awt::Rectangle (
732*b1cdbd2cSJim Jagielski 				aPixelPosition.getX(), aPixelPosition.getY(),
733*b1cdbd2cSJim Jagielski 				aPixelSize.getWidth(), aPixelSize.getHeight());
734*b1cdbd2cSJim Jagielski 		}
735*b1cdbd2cSJim Jagielski 	}
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski     return aBoundingBox;
738*b1cdbd2cSJim Jagielski }
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski 
getLocation(void)743*b1cdbd2cSJim Jagielski awt::Point SAL_CALL AccessibleShape::getLocation (void)
744*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
745*b1cdbd2cSJim Jagielski {
746*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
747*b1cdbd2cSJim Jagielski     awt::Rectangle aBoundingBox (getBounds());
748*b1cdbd2cSJim Jagielski     return awt::Point (aBoundingBox.X, aBoundingBox.Y);
749*b1cdbd2cSJim Jagielski }
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski 
getLocationOnScreen(void)754*b1cdbd2cSJim Jagielski awt::Point SAL_CALL AccessibleShape::getLocationOnScreen (void)
755*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
756*b1cdbd2cSJim Jagielski {
757*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
758*b1cdbd2cSJim Jagielski 
759*b1cdbd2cSJim Jagielski     // Get relative position...
760*b1cdbd2cSJim Jagielski     awt::Point aLocation (getLocation ());
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski     // ... and add absolute position of the parent.
763*b1cdbd2cSJim Jagielski     uno::Reference<XAccessibleComponent> xParentComponent (
764*b1cdbd2cSJim Jagielski         getAccessibleParent(), uno::UNO_QUERY);
765*b1cdbd2cSJim Jagielski     if (xParentComponent.is())
766*b1cdbd2cSJim Jagielski     {
767*b1cdbd2cSJim Jagielski         awt::Point aParentLocation (xParentComponent->getLocationOnScreen());
768*b1cdbd2cSJim Jagielski         aLocation.X += aParentLocation.X;
769*b1cdbd2cSJim Jagielski         aLocation.Y += aParentLocation.Y;
770*b1cdbd2cSJim Jagielski     }
771*b1cdbd2cSJim Jagielski     else
772*b1cdbd2cSJim Jagielski         OSL_TRACE ("getLocation: parent does not support XAccessibleComponent");
773*b1cdbd2cSJim Jagielski     return aLocation;
774*b1cdbd2cSJim Jagielski }
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski 
getSize(void)779*b1cdbd2cSJim Jagielski awt::Size SAL_CALL AccessibleShape::getSize (void)
780*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
781*b1cdbd2cSJim Jagielski {
782*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
783*b1cdbd2cSJim Jagielski     awt::Rectangle aBoundingBox (getBounds());
784*b1cdbd2cSJim Jagielski     return awt::Size (aBoundingBox.Width, aBoundingBox.Height);
785*b1cdbd2cSJim Jagielski }
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski 
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski 
getForeground(void)790*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getForeground (void)
791*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
792*b1cdbd2cSJim Jagielski {
793*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
794*b1cdbd2cSJim Jagielski     sal_Int32 nColor (0x0ffffffL);
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski     try
797*b1cdbd2cSJim Jagielski     {
798*b1cdbd2cSJim Jagielski         uno::Reference<beans::XPropertySet> aSet (mxShape, uno::UNO_QUERY);
799*b1cdbd2cSJim Jagielski         if (aSet.is())
800*b1cdbd2cSJim Jagielski         {
801*b1cdbd2cSJim Jagielski             uno::Any aColor;
802*b1cdbd2cSJim Jagielski             aColor = aSet->getPropertyValue (OUString::createFromAscii ("LineColor"));
803*b1cdbd2cSJim Jagielski             aColor >>= nColor;
804*b1cdbd2cSJim Jagielski         }
805*b1cdbd2cSJim Jagielski     }
806*b1cdbd2cSJim Jagielski     catch (::com::sun::star::beans::UnknownPropertyException)
807*b1cdbd2cSJim Jagielski     {
808*b1cdbd2cSJim Jagielski         // Ignore exception and return default color.
809*b1cdbd2cSJim Jagielski     }
810*b1cdbd2cSJim Jagielski     return nColor;
811*b1cdbd2cSJim Jagielski }
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski 
815*b1cdbd2cSJim Jagielski 
getBackground(void)816*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getBackground (void)
817*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
818*b1cdbd2cSJim Jagielski {
819*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
820*b1cdbd2cSJim Jagielski     sal_Int32 nColor (0L);
821*b1cdbd2cSJim Jagielski 
822*b1cdbd2cSJim Jagielski     try
823*b1cdbd2cSJim Jagielski     {
824*b1cdbd2cSJim Jagielski         uno::Reference<beans::XPropertySet> aSet (mxShape, uno::UNO_QUERY);
825*b1cdbd2cSJim Jagielski         if (aSet.is())
826*b1cdbd2cSJim Jagielski         {
827*b1cdbd2cSJim Jagielski             uno::Any aColor;
828*b1cdbd2cSJim Jagielski             aColor = aSet->getPropertyValue (OUString::createFromAscii ("FillColor"));
829*b1cdbd2cSJim Jagielski             aColor >>= nColor;
830*b1cdbd2cSJim Jagielski 			aColor = aSet->getPropertyValue (OUString::createFromAscii ("FillTransparence"));
831*b1cdbd2cSJim Jagielski 			short nTrans=0;
832*b1cdbd2cSJim Jagielski 			aColor >>= nTrans;
833*b1cdbd2cSJim Jagielski 			Color crBk(nColor);
834*b1cdbd2cSJim Jagielski 			if (nTrans == 0 )
835*b1cdbd2cSJim Jagielski 			{
836*b1cdbd2cSJim Jagielski 				crBk.SetTransparency(0xff);
837*b1cdbd2cSJim Jagielski 			}
838*b1cdbd2cSJim Jagielski 			else
839*b1cdbd2cSJim Jagielski 			{
840*b1cdbd2cSJim Jagielski 				nTrans = short(256 - nTrans / 100. * 256);
841*b1cdbd2cSJim Jagielski 				crBk.SetTransparency(sal_uInt8(nTrans));
842*b1cdbd2cSJim Jagielski 			}
843*b1cdbd2cSJim Jagielski 			nColor = crBk.GetColor();
844*b1cdbd2cSJim Jagielski         }
845*b1cdbd2cSJim Jagielski     }
846*b1cdbd2cSJim Jagielski     catch (::com::sun::star::beans::UnknownPropertyException)
847*b1cdbd2cSJim Jagielski     {
848*b1cdbd2cSJim Jagielski         // Ignore exception and return default color.
849*b1cdbd2cSJim Jagielski     }
850*b1cdbd2cSJim Jagielski     return nColor;
851*b1cdbd2cSJim Jagielski }
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski 
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski //=====  XAccessibleEventBroadcaster  =========================================
857*b1cdbd2cSJim Jagielski 
addEventListener(const Reference<XAccessibleEventListener> & rxListener)858*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleShape::addEventListener (
859*b1cdbd2cSJim Jagielski     const Reference<XAccessibleEventListener >& rxListener)
860*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
861*b1cdbd2cSJim Jagielski {
862*b1cdbd2cSJim Jagielski 	if (rBHelper.bDisposed || rBHelper.bInDispose)
863*b1cdbd2cSJim Jagielski 	{
864*b1cdbd2cSJim Jagielski         uno::Reference<uno::XInterface> xThis (
865*b1cdbd2cSJim Jagielski             (lang::XComponent *)this, uno::UNO_QUERY);
866*b1cdbd2cSJim Jagielski 		rxListener->disposing (lang::EventObject (xThis));
867*b1cdbd2cSJim Jagielski 	}
868*b1cdbd2cSJim Jagielski     else
869*b1cdbd2cSJim Jagielski     {
870*b1cdbd2cSJim Jagielski         AccessibleContextBase::addEventListener (rxListener);
871*b1cdbd2cSJim Jagielski         if (mpText != NULL)
872*b1cdbd2cSJim Jagielski             mpText->AddEventListener (rxListener);
873*b1cdbd2cSJim Jagielski     }
874*b1cdbd2cSJim Jagielski }
875*b1cdbd2cSJim Jagielski 
876*b1cdbd2cSJim Jagielski 
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 
removeEventListener(const Reference<XAccessibleEventListener> & rxListener)879*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleShape::removeEventListener (
880*b1cdbd2cSJim Jagielski     const Reference<XAccessibleEventListener >& rxListener)
881*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
882*b1cdbd2cSJim Jagielski {
883*b1cdbd2cSJim Jagielski     AccessibleContextBase::removeEventListener (rxListener);
884*b1cdbd2cSJim Jagielski     if (mpText != NULL)
885*b1cdbd2cSJim Jagielski         mpText->RemoveEventListener (rxListener);
886*b1cdbd2cSJim Jagielski }
887*b1cdbd2cSJim Jagielski 
888*b1cdbd2cSJim Jagielski 
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski //=====  XInterface  ==========================================================
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski com::sun::star::uno::Any SAL_CALL
queryInterface(const com::sun::star::uno::Type & rType)894*b1cdbd2cSJim Jagielski     AccessibleShape::queryInterface (const com::sun::star::uno::Type & rType)
895*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
896*b1cdbd2cSJim Jagielski {
897*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Any aReturn = AccessibleContextBase::queryInterface (rType);
898*b1cdbd2cSJim Jagielski     if ( ! aReturn.hasValue())
899*b1cdbd2cSJim Jagielski         aReturn = ::cppu::queryInterface (rType,
900*b1cdbd2cSJim Jagielski             static_cast<XAccessibleComponent*>(this),
901*b1cdbd2cSJim Jagielski             static_cast<XAccessibleExtendedComponent*>(this),
902*b1cdbd2cSJim Jagielski             static_cast< ::com::sun::star::accessibility::XAccessibleSelection* >(this),
903*b1cdbd2cSJim Jagielski 
904*b1cdbd2cSJim Jagielski 	     static_cast< ::com::sun::star::accessibility::XAccessibleExtendedAttributes* >(this),
905*b1cdbd2cSJim Jagielski             static_cast<lang::XEventListener*>(this),
906*b1cdbd2cSJim Jagielski             static_cast<document::XEventListener*>(this),
907*b1cdbd2cSJim Jagielski             static_cast<lang::XUnoTunnel*>(this),
908*b1cdbd2cSJim Jagielski             static_cast<XAccessibleGroupPosition*>(this),
909*b1cdbd2cSJim Jagielski             static_cast<XAccessibleHypertext*>(this)
910*b1cdbd2cSJim Jagielski             );
911*b1cdbd2cSJim Jagielski     return aReturn;
912*b1cdbd2cSJim Jagielski }
913*b1cdbd2cSJim Jagielski 
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski 
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski void SAL_CALL
acquire(void)918*b1cdbd2cSJim Jagielski     AccessibleShape::acquire (void)
919*b1cdbd2cSJim Jagielski     throw ()
920*b1cdbd2cSJim Jagielski {
921*b1cdbd2cSJim Jagielski     AccessibleContextBase::acquire ();
922*b1cdbd2cSJim Jagielski }
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski 
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski void SAL_CALL
release(void)928*b1cdbd2cSJim Jagielski     AccessibleShape::release (void)
929*b1cdbd2cSJim Jagielski     throw ()
930*b1cdbd2cSJim Jagielski {
931*b1cdbd2cSJim Jagielski     AccessibleContextBase::release ();
932*b1cdbd2cSJim Jagielski }
933*b1cdbd2cSJim Jagielski //
934*b1cdbd2cSJim Jagielski //=====  XAccessibleSelection  ============================================
935*b1cdbd2cSJim Jagielski //
936*b1cdbd2cSJim Jagielski 
937*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------
selectAccessibleChild(sal_Int32)938*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleShape::selectAccessibleChild( sal_Int32 )
939*b1cdbd2cSJim Jagielski throw ( IndexOutOfBoundsException, RuntimeException )
940*b1cdbd2cSJim Jagielski {
941*b1cdbd2cSJim Jagielski }
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------------
isAccessibleChildSelected(sal_Int32 nChildIndex)944*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleShape::isAccessibleChildSelected( sal_Int32 nChildIndex )
945*b1cdbd2cSJim Jagielski throw ( IndexOutOfBoundsException,
946*b1cdbd2cSJim Jagielski 	   RuntimeException )
947*b1cdbd2cSJim Jagielski {
948*b1cdbd2cSJim Jagielski 	uno::Reference<XAccessible> xAcc = getAccessibleChild( nChildIndex );
949*b1cdbd2cSJim Jagielski 	uno::Reference<XAccessibleContext> xContext;
950*b1cdbd2cSJim Jagielski 	if( xAcc.is() )
951*b1cdbd2cSJim Jagielski 	{
952*b1cdbd2cSJim Jagielski 		xContext = xAcc->getAccessibleContext();
953*b1cdbd2cSJim Jagielski 	}
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski 	if( xContext.is() )
956*b1cdbd2cSJim Jagielski 	{
957*b1cdbd2cSJim Jagielski 		if( xContext->getAccessibleRole() == AccessibleRole::PARAGRAPH )
958*b1cdbd2cSJim Jagielski 		{
959*b1cdbd2cSJim Jagielski 			uno::Reference< ::com::sun::star::accessibility::XAccessibleText >
960*b1cdbd2cSJim Jagielski 				xText(xAcc, uno::UNO_QUERY);
961*b1cdbd2cSJim Jagielski 			if( xText.is() )
962*b1cdbd2cSJim Jagielski 			{
963*b1cdbd2cSJim Jagielski 				if( xText->getSelectionStart() >= 0 ) return sal_True;
964*b1cdbd2cSJim Jagielski 			}
965*b1cdbd2cSJim Jagielski 		}
966*b1cdbd2cSJim Jagielski 		else if( xContext->getAccessibleRole() == AccessibleRole::SHAPE )
967*b1cdbd2cSJim Jagielski 		{
968*b1cdbd2cSJim Jagielski 			Reference< XAccessibleStateSet > pRState = xContext->getAccessibleStateSet();
969*b1cdbd2cSJim Jagielski 			if( !pRState.is() )
970*b1cdbd2cSJim Jagielski 				return sal_False;
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski 			uno::Sequence<short> pStates = pRState->getStates();
973*b1cdbd2cSJim Jagielski 			int nCount = pStates.getLength();
974*b1cdbd2cSJim Jagielski 			for( int i = 0; i < nCount; i++ )
975*b1cdbd2cSJim Jagielski 			{
976*b1cdbd2cSJim Jagielski 				if(pStates[i] == AccessibleStateType::SELECTED)
977*b1cdbd2cSJim Jagielski 					return sal_True;
978*b1cdbd2cSJim Jagielski 			}
979*b1cdbd2cSJim Jagielski 			return sal_False;
980*b1cdbd2cSJim Jagielski 		}
981*b1cdbd2cSJim Jagielski 	}
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski 	return sal_False;
984*b1cdbd2cSJim Jagielski }
985*b1cdbd2cSJim Jagielski 
986*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------
clearAccessibleSelection()987*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleShape::clearAccessibleSelection(  )
988*b1cdbd2cSJim Jagielski throw ( RuntimeException )
989*b1cdbd2cSJim Jagielski {
990*b1cdbd2cSJim Jagielski }
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
selectAllAccessibleChildren()993*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleShape::selectAllAccessibleChildren(  )
994*b1cdbd2cSJim Jagielski throw ( RuntimeException )
995*b1cdbd2cSJim Jagielski {
996*b1cdbd2cSJim Jagielski }
997*b1cdbd2cSJim Jagielski 
998*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
getSelectedAccessibleChildCount()999*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getSelectedAccessibleChildCount()
1000*b1cdbd2cSJim Jagielski throw ( RuntimeException )
1001*b1cdbd2cSJim Jagielski {
1002*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = 0;
1003*b1cdbd2cSJim Jagielski 	sal_Int32 TotalCount = getAccessibleChildCount();
1004*b1cdbd2cSJim Jagielski 	for( sal_Int32 i = 0; i < TotalCount; i++ )
1005*b1cdbd2cSJim Jagielski 		if( isAccessibleChildSelected(i) ) nCount++;
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski 	return nCount;
1008*b1cdbd2cSJim Jagielski }
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------
getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex)1011*b1cdbd2cSJim Jagielski Reference<XAccessible> SAL_CALL AccessibleShape::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex )
1012*b1cdbd2cSJim Jagielski throw ( IndexOutOfBoundsException, RuntimeException)
1013*b1cdbd2cSJim Jagielski {
1014*b1cdbd2cSJim Jagielski 	if ( nSelectedChildIndex > getSelectedAccessibleChildCount() )
1015*b1cdbd2cSJim Jagielski 		throw IndexOutOfBoundsException();
1016*b1cdbd2cSJim Jagielski 	sal_Int32 i1, i2;
1017*b1cdbd2cSJim Jagielski 	for( i1 = 0, i2 = 0; i1 < getAccessibleChildCount(); i1++ )
1018*b1cdbd2cSJim Jagielski 		if( isAccessibleChildSelected(i1) )
1019*b1cdbd2cSJim Jagielski 		{
1020*b1cdbd2cSJim Jagielski 			if( i2 == nSelectedChildIndex )
1021*b1cdbd2cSJim Jagielski 				return getAccessibleChild( i1 );
1022*b1cdbd2cSJim Jagielski 			i2++;
1023*b1cdbd2cSJim Jagielski 		}
1024*b1cdbd2cSJim Jagielski 	return Reference<XAccessible>();
1025*b1cdbd2cSJim Jagielski }
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------------
deselectAccessibleChild(sal_Int32)1028*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleShape::deselectAccessibleChild( sal_Int32 )
1029*b1cdbd2cSJim Jagielski 															throw ( IndexOutOfBoundsException,
1030*b1cdbd2cSJim Jagielski 															RuntimeException )
1031*b1cdbd2cSJim Jagielski {
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski }
1034*b1cdbd2cSJim Jagielski 
1035*b1cdbd2cSJim Jagielski //=====  XAccessibleExtendedAttributes  ========================================================
getExtendedAttributes()1036*b1cdbd2cSJim Jagielski uno::Any SAL_CALL AccessibleShape::getExtendedAttributes()
1037*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1038*b1cdbd2cSJim Jagielski {
1039*b1cdbd2cSJim Jagielski 	uno::Any strRet;
1040*b1cdbd2cSJim Jagielski 	::rtl::OUString style;
1041*b1cdbd2cSJim Jagielski 	if( getAccessibleRole() != AccessibleRole::SHAPE ) return strRet;
1042*b1cdbd2cSJim Jagielski 	if( m_pShape )
1043*b1cdbd2cSJim Jagielski 	{
1044*b1cdbd2cSJim Jagielski 		//style = ::rtl::OUString::createFromAscii("style=");
1045*b1cdbd2cSJim Jagielski 		style = ::rtl::OUString::createFromAscii("style:");
1046*b1cdbd2cSJim Jagielski 		style += GetStyle();
1047*b1cdbd2cSJim Jagielski 	}
1048*b1cdbd2cSJim Jagielski 	style += ::rtl::OUString::createFromAscii(";");
1049*b1cdbd2cSJim Jagielski 	strRet <<= style;
1050*b1cdbd2cSJim Jagielski 	return strRet;
1051*b1cdbd2cSJim Jagielski }
1052*b1cdbd2cSJim Jagielski //=====  XServiceInfo  ========================================================
1053*b1cdbd2cSJim Jagielski 
1054*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL
getImplementationName(void)1055*b1cdbd2cSJim Jagielski     AccessibleShape::getImplementationName (void)
1056*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
1057*b1cdbd2cSJim Jagielski {
1058*b1cdbd2cSJim Jagielski 	return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AccessibleShape"));
1059*b1cdbd2cSJim Jagielski }
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski 
1062*b1cdbd2cSJim Jagielski 
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski uno::Sequence<OUString> SAL_CALL
getSupportedServiceNames(void)1065*b1cdbd2cSJim Jagielski     AccessibleShape::getSupportedServiceNames (void)
1066*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
1067*b1cdbd2cSJim Jagielski {
1068*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
1069*b1cdbd2cSJim Jagielski     // Get list of supported service names from base class...
1070*b1cdbd2cSJim Jagielski     uno::Sequence<OUString> aServiceNames =
1071*b1cdbd2cSJim Jagielski         AccessibleContextBase::getSupportedServiceNames();
1072*b1cdbd2cSJim Jagielski     sal_Int32 nCount (aServiceNames.getLength());
1073*b1cdbd2cSJim Jagielski 
1074*b1cdbd2cSJim Jagielski     // ...and add additional names.
1075*b1cdbd2cSJim Jagielski     aServiceNames.realloc (nCount + 1);
1076*b1cdbd2cSJim Jagielski     static const OUString sAdditionalServiceName (RTL_CONSTASCII_USTRINGPARAM(
1077*b1cdbd2cSJim Jagielski         "com.sun.star.drawing.AccessibleShape"));
1078*b1cdbd2cSJim Jagielski     aServiceNames[nCount] = sAdditionalServiceName;
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski     return aServiceNames;
1081*b1cdbd2cSJim Jagielski }
1082*b1cdbd2cSJim Jagielski 
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski 
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski 
1087*b1cdbd2cSJim Jagielski //=====  XTypeProvider  ===================================================
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski uno::Sequence<uno::Type> SAL_CALL
getTypes(void)1090*b1cdbd2cSJim Jagielski     AccessibleShape::getTypes (void)
1091*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
1092*b1cdbd2cSJim Jagielski {
1093*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
1094*b1cdbd2cSJim Jagielski     // Get list of types from the context base implementation, ...
1095*b1cdbd2cSJim Jagielski 	uno::Sequence<uno::Type> aTypeList (AccessibleContextBase::getTypes());
1096*b1cdbd2cSJim Jagielski     // ... get list of types from component base implementation, ...
1097*b1cdbd2cSJim Jagielski 	uno::Sequence<uno::Type> aComponentTypeList (AccessibleComponentBase::getTypes());
1098*b1cdbd2cSJim Jagielski     // ... define local types, ...
1099*b1cdbd2cSJim Jagielski     const uno::Type aLangEventListenerType =
1100*b1cdbd2cSJim Jagielski     	::getCppuType((const uno::Reference<lang::XEventListener>*)0);
1101*b1cdbd2cSJim Jagielski     const uno::Type aDocumentEventListenerType =
1102*b1cdbd2cSJim Jagielski     	::getCppuType((const uno::Reference<document::XEventListener>*)0);
1103*b1cdbd2cSJim Jagielski     const uno::Type aUnoTunnelType =
1104*b1cdbd2cSJim Jagielski     	::getCppuType((const uno::Reference<lang::XUnoTunnel>*)0);
1105*b1cdbd2cSJim Jagielski     //    const uno::Type aStateSetType =
1106*b1cdbd2cSJim Jagielski     //    	::getCppuType((const uno::Reference<XAccessibleStateSet>*)0);
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski     // ... and merge them all into one list.
1109*b1cdbd2cSJim Jagielski     sal_Int32   nTypeCount (aTypeList.getLength()),
1110*b1cdbd2cSJim Jagielski         nComponentTypeCount (aComponentTypeList.getLength());
1111*b1cdbd2cSJim Jagielski     int         i;
1112*b1cdbd2cSJim Jagielski 
1113*b1cdbd2cSJim Jagielski     aTypeList.realloc (nTypeCount + nComponentTypeCount + 3);
1114*b1cdbd2cSJim Jagielski 
1115*b1cdbd2cSJim Jagielski     for (i=0; i<nComponentTypeCount; i++)
1116*b1cdbd2cSJim Jagielski         aTypeList[nTypeCount + i] = aComponentTypeList[i];
1117*b1cdbd2cSJim Jagielski 
1118*b1cdbd2cSJim Jagielski     aTypeList[nTypeCount + i++ ] = aLangEventListenerType;
1119*b1cdbd2cSJim Jagielski     aTypeList[nTypeCount + i++ ] = aDocumentEventListenerType;
1120*b1cdbd2cSJim Jagielski     aTypeList[nTypeCount + i ] = aUnoTunnelType;
1121*b1cdbd2cSJim Jagielski 
1122*b1cdbd2cSJim Jagielski 	return aTypeList;
1123*b1cdbd2cSJim Jagielski }
1124*b1cdbd2cSJim Jagielski 
1125*b1cdbd2cSJim Jagielski 
1126*b1cdbd2cSJim Jagielski 
1127*b1cdbd2cSJim Jagielski 
1128*b1cdbd2cSJim Jagielski //=====  lang::XEventListener  ================================================
1129*b1cdbd2cSJim Jagielski 
1130*b1cdbd2cSJim Jagielski /** Disposing calls are accepted only from the model: Just reset the
1131*b1cdbd2cSJim Jagielski     reference to the model in the shape tree info.  Otherwise this object
1132*b1cdbd2cSJim Jagielski     remains functional.
1133*b1cdbd2cSJim Jagielski */
1134*b1cdbd2cSJim Jagielski void SAL_CALL
disposing(const lang::EventObject & aEvent)1135*b1cdbd2cSJim Jagielski     AccessibleShape::disposing (const lang::EventObject& aEvent)
1136*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
1137*b1cdbd2cSJim Jagielski {
1138*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
1139*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
1140*b1cdbd2cSJim Jagielski 
1141*b1cdbd2cSJim Jagielski     try
1142*b1cdbd2cSJim Jagielski     {
1143*b1cdbd2cSJim Jagielski         if (aEvent.Source ==  maShapeTreeInfo.GetModelBroadcaster())
1144*b1cdbd2cSJim Jagielski         {
1145*b1cdbd2cSJim Jagielski             // Remove reference to model broadcaster to allow it to pass
1146*b1cdbd2cSJim Jagielski             // away.
1147*b1cdbd2cSJim Jagielski             maShapeTreeInfo.SetModelBroadcaster(NULL);
1148*b1cdbd2cSJim Jagielski         }
1149*b1cdbd2cSJim Jagielski 
1150*b1cdbd2cSJim Jagielski     }
1151*b1cdbd2cSJim Jagielski     catch (uno::RuntimeException e)
1152*b1cdbd2cSJim Jagielski     {
1153*b1cdbd2cSJim Jagielski         OSL_TRACE ("caught exception while disposing");
1154*b1cdbd2cSJim Jagielski     }
1155*b1cdbd2cSJim Jagielski }
1156*b1cdbd2cSJim Jagielski 
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski //=====  document::XEventListener  ============================================
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski void SAL_CALL
notifyEvent(const document::EventObject & rEventObject)1163*b1cdbd2cSJim Jagielski     AccessibleShape::notifyEvent (const document::EventObject& rEventObject)
1164*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
1165*b1cdbd2cSJim Jagielski {
1166*b1cdbd2cSJim Jagielski 	static const OUString sShapeModified (
1167*b1cdbd2cSJim Jagielski 		RTL_CONSTASCII_USTRINGPARAM("ShapeModified"));
1168*b1cdbd2cSJim Jagielski 
1169*b1cdbd2cSJim Jagielski     // First check if the event is for us.
1170*b1cdbd2cSJim Jagielski     uno::Reference<drawing::XShape> xShape (
1171*b1cdbd2cSJim Jagielski         rEventObject.Source, uno::UNO_QUERY);
1172*b1cdbd2cSJim Jagielski     if ( xShape.get() == mxShape.get() )
1173*b1cdbd2cSJim Jagielski     {
1174*b1cdbd2cSJim Jagielski         if (rEventObject.EventName.equals (sShapeModified))
1175*b1cdbd2cSJim Jagielski         {
1176*b1cdbd2cSJim Jagielski 			//Need to update text children when receiving ShapeModified hint when exiting edit mode for text box
1177*b1cdbd2cSJim Jagielski 			if (mpText)
1178*b1cdbd2cSJim Jagielski 				mpText->UpdateChildren();
1179*b1cdbd2cSJim Jagielski 
1180*b1cdbd2cSJim Jagielski 
1181*b1cdbd2cSJim Jagielski             // Some property of a shape has been modified.  Send an event
1182*b1cdbd2cSJim Jagielski             // that indicates a change of the visible data to all listeners.
1183*b1cdbd2cSJim Jagielski             CommitChange (
1184*b1cdbd2cSJim Jagielski                 AccessibleEventId::VISIBLE_DATA_CHANGED,
1185*b1cdbd2cSJim Jagielski                 uno::Any(),
1186*b1cdbd2cSJim Jagielski                 uno::Any());
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski             // Name and Description may have changed.  Update the local
1189*b1cdbd2cSJim Jagielski             // values accordingly.
1190*b1cdbd2cSJim Jagielski             UpdateNameAndDescription();
1191*b1cdbd2cSJim Jagielski         }
1192*b1cdbd2cSJim Jagielski     }
1193*b1cdbd2cSJim Jagielski }
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski 
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 
1198*b1cdbd2cSJim Jagielski //=====  lang::XUnoTunnel  ================================================
1199*b1cdbd2cSJim Jagielski 
1200*b1cdbd2cSJim Jagielski const uno::Sequence< sal_Int8 >&
getUnoTunnelImplementationId()1201*b1cdbd2cSJim Jagielski     AccessibleShape::getUnoTunnelImplementationId()
1202*b1cdbd2cSJim Jagielski     throw()
1203*b1cdbd2cSJim Jagielski {
1204*b1cdbd2cSJim Jagielski 	static uno::Sequence< sal_Int8 >* pSeq = 0;
1205*b1cdbd2cSJim Jagielski 
1206*b1cdbd2cSJim Jagielski     if( !pSeq )
1207*b1cdbd2cSJim Jagielski 	{
1208*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
1209*b1cdbd2cSJim Jagielski 
1210*b1cdbd2cSJim Jagielski         if( !pSeq )
1211*b1cdbd2cSJim Jagielski 		{
1212*b1cdbd2cSJim Jagielski 			static uno::Sequence< sal_Int8 > aSeq( 16 );
1213*b1cdbd2cSJim Jagielski 			rtl_createUuid( (sal_uInt8*) aSeq.getArray(), 0, sal_True );
1214*b1cdbd2cSJim Jagielski 			pSeq = &aSeq;
1215*b1cdbd2cSJim Jagielski 		}
1216*b1cdbd2cSJim Jagielski 	}
1217*b1cdbd2cSJim Jagielski 
1218*b1cdbd2cSJim Jagielski     return( *pSeq );
1219*b1cdbd2cSJim Jagielski }
1220*b1cdbd2cSJim Jagielski 
1221*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
1222*b1cdbd2cSJim Jagielski AccessibleShape*
getImplementation(const uno::Reference<uno::XInterface> & rxIFace)1223*b1cdbd2cSJim Jagielski     AccessibleShape::getImplementation( const uno::Reference< uno::XInterface >& rxIFace )
1224*b1cdbd2cSJim Jagielski     throw()
1225*b1cdbd2cSJim Jagielski {
1226*b1cdbd2cSJim Jagielski     uno::Reference< lang::XUnoTunnel >  xTunnel( rxIFace, uno::UNO_QUERY );
1227*b1cdbd2cSJim Jagielski 	AccessibleShape*                    pReturn = NULL;
1228*b1cdbd2cSJim Jagielski 
1229*b1cdbd2cSJim Jagielski     if( xTunnel.is() )
1230*b1cdbd2cSJim Jagielski 		pReturn = reinterpret_cast< AccessibleShape* >( xTunnel->getSomething( getUnoTunnelImplementationId() ) );
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski 	return( pReturn );
1233*b1cdbd2cSJim Jagielski }
1234*b1cdbd2cSJim Jagielski 
1235*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
1236*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL
getSomething(const uno::Sequence<sal_Int8> & rIdentifier)1237*b1cdbd2cSJim Jagielski     AccessibleShape::getSomething( const uno::Sequence< sal_Int8 >& rIdentifier )
1238*b1cdbd2cSJim Jagielski     throw(uno::RuntimeException)
1239*b1cdbd2cSJim Jagielski {
1240*b1cdbd2cSJim Jagielski 	sal_Int64 nReturn( 0 );
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski 	if(	( rIdentifier.getLength() == 16 ) && ( 0 == rtl_compareMemory( getUnoTunnelImplementationId().getConstArray(), rIdentifier.getConstArray(), 16 ) ) )
1243*b1cdbd2cSJim Jagielski 		nReturn = reinterpret_cast< sal_Int64 >( this );
1244*b1cdbd2cSJim Jagielski 
1245*b1cdbd2cSJim Jagielski 	return( nReturn );
1246*b1cdbd2cSJim Jagielski }
1247*b1cdbd2cSJim Jagielski 
1248*b1cdbd2cSJim Jagielski //=====  IAccessibleViewForwarderListener  ====================================
1249*b1cdbd2cSJim Jagielski 
ViewForwarderChanged(ChangeType aChangeType,const IAccessibleViewForwarder * pViewForwarder)1250*b1cdbd2cSJim Jagielski void AccessibleShape::ViewForwarderChanged (ChangeType aChangeType,
1251*b1cdbd2cSJim Jagielski         const IAccessibleViewForwarder* pViewForwarder)
1252*b1cdbd2cSJim Jagielski {
1253*b1cdbd2cSJim Jagielski     // Inform all listeners that the graphical representation (i.e. size
1254*b1cdbd2cSJim Jagielski     // and/or position) of the shape has changed.
1255*b1cdbd2cSJim Jagielski     CommitChange (AccessibleEventId::VISIBLE_DATA_CHANGED,
1256*b1cdbd2cSJim Jagielski         uno::Any(),
1257*b1cdbd2cSJim Jagielski         uno::Any());
1258*b1cdbd2cSJim Jagielski 
1259*b1cdbd2cSJim Jagielski     // Tell children manager of the modified view forwarder.
1260*b1cdbd2cSJim Jagielski     if (mpChildrenManager != NULL)
1261*b1cdbd2cSJim Jagielski         mpChildrenManager->ViewForwarderChanged (aChangeType, pViewForwarder);
1262*b1cdbd2cSJim Jagielski 
1263*b1cdbd2cSJim Jagielski     // update our children that our screen position might have changed
1264*b1cdbd2cSJim Jagielski     if( mpText )
1265*b1cdbd2cSJim Jagielski         mpText->UpdateChildren();
1266*b1cdbd2cSJim Jagielski }
1267*b1cdbd2cSJim Jagielski 
1268*b1cdbd2cSJim Jagielski 
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski //=====  protected internal  ==================================================
1272*b1cdbd2cSJim Jagielski ///	Set this object's name if is different to the current name.
1273*b1cdbd2cSJim Jagielski ::rtl::OUString
CreateAccessibleBaseName(void)1274*b1cdbd2cSJim Jagielski     AccessibleShape::CreateAccessibleBaseName (void)
1275*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
1276*b1cdbd2cSJim Jagielski {
1277*b1cdbd2cSJim Jagielski 	return ShapeTypeHandler::CreateAccessibleBaseName( mxShape );
1278*b1cdbd2cSJim Jagielski }
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski ::rtl::OUString
CreateAccessibleName(void)1282*b1cdbd2cSJim Jagielski     AccessibleShape::CreateAccessibleName (void)
1283*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
1284*b1cdbd2cSJim Jagielski {
1285*b1cdbd2cSJim Jagielski     //OUString sName (CreateAccessibleBaseName());
1286*b1cdbd2cSJim Jagielski 	OUString sName;
1287*b1cdbd2cSJim Jagielski 	sName = GetFullAccessibleName(this);
1288*b1cdbd2cSJim Jagielski 	return sName;
1289*b1cdbd2cSJim Jagielski }
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski ::rtl::OUString
GetFullAccessibleName(AccessibleShape * shape)1292*b1cdbd2cSJim Jagielski     AccessibleShape::GetFullAccessibleName (AccessibleShape *shape)
1293*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
1294*b1cdbd2cSJim Jagielski {
1295*b1cdbd2cSJim Jagielski     OUString sName (shape->CreateAccessibleBaseName());
1296*b1cdbd2cSJim Jagielski     // Append the shape's index to the name to disambiguate between shapes
1297*b1cdbd2cSJim Jagielski     // of the same type.  If such an index where not given to the
1298*b1cdbd2cSJim Jagielski     // constructor then use the z-order instead.  If even that does not exist
1299*b1cdbd2cSJim Jagielski     // we throw an exception.
1300*b1cdbd2cSJim Jagielski     //long nIndex = mnIndex;
1301*b1cdbd2cSJim Jagielski     //if (nIndex == -1)
1302*b1cdbd2cSJim Jagielski     //{
1303*b1cdbd2cSJim Jagielski     //    try
1304*b1cdbd2cSJim Jagielski     //    {
1305*b1cdbd2cSJim Jagielski     //        uno::Reference<beans::XPropertySet> xSet (mxShape, uno::UNO_QUERY);
1306*b1cdbd2cSJim Jagielski     //        if (xSet.is())
1307*b1cdbd2cSJim Jagielski     //        {
1308*b1cdbd2cSJim Jagielski     //            uno::Any aZOrder (xSet->getPropertyValue (::rtl::OUString::createFromAscii ("ZOrder")));
1309*b1cdbd2cSJim Jagielski     //            aZOrder >>= nIndex;
1310*b1cdbd2cSJim Jagielski 
1311*b1cdbd2cSJim Jagielski     //            // Add one to be not zero based.
1312*b1cdbd2cSJim Jagielski     //            nIndex += 1;
1313*b1cdbd2cSJim Jagielski     //        }
1314*b1cdbd2cSJim Jagielski     //    }
1315*b1cdbd2cSJim Jagielski     //    catch (beans::UnknownPropertyException)
1316*b1cdbd2cSJim Jagielski     //    {
1317*b1cdbd2cSJim Jagielski     //        // We throw our own exception that is a bit more informative.
1318*b1cdbd2cSJim Jagielski     //        throw uno::RuntimeException (::rtl::OUString (
1319*b1cdbd2cSJim Jagielski     //            RTL_CONSTASCII_USTRINGPARAM("AccessibleShape has invalid index and no ZOrder property")),
1320*b1cdbd2cSJim Jagielski     //            static_cast<uno::XWeak*>(this));
1321*b1cdbd2cSJim Jagielski     //    }
1322*b1cdbd2cSJim Jagielski 
1323*b1cdbd2cSJim Jagielski     //}
1324*b1cdbd2cSJim Jagielski 
1325*b1cdbd2cSJim Jagielski     //// Put a space between name and index because of Gnopernicus othewise
1326*b1cdbd2cSJim Jagielski     //// spells the name.
1327*b1cdbd2cSJim Jagielski     //sName += OUString (RTL_CONSTASCII_USTRINGPARAM(" ")) + OUString::valueOf (nIndex);
1328*b1cdbd2cSJim Jagielski 
1329*b1cdbd2cSJim Jagielski     //return sName;
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski 	XubString nameStr;
1332*b1cdbd2cSJim Jagielski 	if(shape->m_pShape)
1333*b1cdbd2cSJim Jagielski 		nameStr = shape->m_pShape->GetName();
1334*b1cdbd2cSJim Jagielski 	if(nameStr.Len() == 0)
1335*b1cdbd2cSJim Jagielski 	{
1336*b1cdbd2cSJim Jagielski 		sName +=  OUString( RTL_CONSTASCII_USTRINGPARAM( " " ));
1337*b1cdbd2cSJim Jagielski 	}
1338*b1cdbd2cSJim Jagielski 	else
1339*b1cdbd2cSJim Jagielski 	{
1340*b1cdbd2cSJim Jagielski 		sName = nameStr;
1341*b1cdbd2cSJim Jagielski 	}
1342*b1cdbd2cSJim Jagielski 	/*
1343*b1cdbd2cSJim Jagielski     sal_Int32 nChildCount = shape->getAccessibleChildCount();
1344*b1cdbd2cSJim Jagielski  	if(nChildCount > 0)
1345*b1cdbd2cSJim Jagielski       {
1346*b1cdbd2cSJim Jagielski 	    for (sal_Int32 i=0; i<nChildCount; ++i)
1347*b1cdbd2cSJim Jagielski 	    {
1348*b1cdbd2cSJim Jagielski 	        Reference<XAccessible> xChild (shape->getAccessibleChild (i));
1349*b1cdbd2cSJim Jagielski 	        if (xChild.is())
1350*b1cdbd2cSJim Jagielski 	        {
1351*b1cdbd2cSJim Jagielski 			uno::Reference <XAccessibleContext> xChildContext(xChild->getAccessibleContext());
1352*b1cdbd2cSJim Jagielski 			if (xChildContext->getAccessibleRole() == AccessibleRole::PARAGRAPH)
1353*b1cdbd2cSJim Jagielski 			{
1354*b1cdbd2cSJim Jagielski 				uno::Reference<XAccessibleText> xText = uno::Reference<XAccessibleText> ( xChild, uno::UNO_QUERY );
1355*b1cdbd2cSJim Jagielski 				sName += OUString( RTL_CONSTASCII_USTRINGPARAM( " " )) + xText->getText();
1356*b1cdbd2cSJim Jagielski 			}
1357*b1cdbd2cSJim Jagielski 			else if (xChildContext->getAccessibleRole() == AccessibleRole::SHAPE)
1358*b1cdbd2cSJim Jagielski 			{
1359*b1cdbd2cSJim Jagielski 				sName += OUString( RTL_CONSTASCII_USTRINGPARAM( " " )) + GetFullAccessibleName(static_cast< AccessibleShape*>( xChild.get()));
1360*b1cdbd2cSJim Jagielski 			}
1361*b1cdbd2cSJim Jagielski 	        }
1362*b1cdbd2cSJim Jagielski 	    }
1363*b1cdbd2cSJim Jagielski       }
1364*b1cdbd2cSJim Jagielski 	 */
1365*b1cdbd2cSJim Jagielski     //Solution:If the new produced name if not the same with last,notify name changed
1366*b1cdbd2cSJim Jagielski 	//         Event
1367*b1cdbd2cSJim Jagielski     if( aAccName != sName && aAccName.getLength() != 0 )
1368*b1cdbd2cSJim Jagielski     {
1369*b1cdbd2cSJim Jagielski     	uno::Any aOldValue, aNewValue;
1370*b1cdbd2cSJim Jagielski 		aOldValue <<= aAccName;
1371*b1cdbd2cSJim Jagielski 		aNewValue <<= sName;
1372*b1cdbd2cSJim Jagielski         CommitChange(
1373*b1cdbd2cSJim Jagielski             AccessibleEventId::NAME_CHANGED,
1374*b1cdbd2cSJim Jagielski             aNewValue,
1375*b1cdbd2cSJim Jagielski             aOldValue);
1376*b1cdbd2cSJim Jagielski     }
1377*b1cdbd2cSJim Jagielski     aAccName = sName;
1378*b1cdbd2cSJim Jagielski 	return sName;
1379*b1cdbd2cSJim Jagielski }
1380*b1cdbd2cSJim Jagielski ::rtl::OUString
CreateAccessibleDescription(void)1381*b1cdbd2cSJim Jagielski     AccessibleShape::CreateAccessibleDescription (void)
1382*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
1383*b1cdbd2cSJim Jagielski {
1384*b1cdbd2cSJim Jagielski     DescriptionGenerator aDG (mxShape);
1385*b1cdbd2cSJim Jagielski     aDG.Initialize (CreateAccessibleBaseName());
1386*b1cdbd2cSJim Jagielski     switch (ShapeTypeHandler::Instance().GetTypeId (mxShape))
1387*b1cdbd2cSJim Jagielski     {
1388*b1cdbd2cSJim Jagielski         case DRAWING_3D_CUBE:
1389*b1cdbd2cSJim Jagielski         case DRAWING_3D_EXTRUDE:
1390*b1cdbd2cSJim Jagielski         case DRAWING_3D_LATHE:
1391*b1cdbd2cSJim Jagielski         case DRAWING_3D_SPHERE:
1392*b1cdbd2cSJim Jagielski             aDG.Add3DProperties ();
1393*b1cdbd2cSJim Jagielski             break;
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski         case DRAWING_3D_SCENE:
1396*b1cdbd2cSJim Jagielski         case DRAWING_GROUP:
1397*b1cdbd2cSJim Jagielski         case DRAWING_PAGE:
1398*b1cdbd2cSJim Jagielski             // No further information is appended.
1399*b1cdbd2cSJim Jagielski             break;
1400*b1cdbd2cSJim Jagielski 
1401*b1cdbd2cSJim Jagielski         case DRAWING_CAPTION:
1402*b1cdbd2cSJim Jagielski         case DRAWING_CLOSED_BEZIER:
1403*b1cdbd2cSJim Jagielski         case DRAWING_CLOSED_FREEHAND:
1404*b1cdbd2cSJim Jagielski         case DRAWING_ELLIPSE:
1405*b1cdbd2cSJim Jagielski         case DRAWING_POLY_POLYGON:
1406*b1cdbd2cSJim Jagielski         case DRAWING_POLY_POLYGON_PATH:
1407*b1cdbd2cSJim Jagielski         case DRAWING_RECTANGLE:
1408*b1cdbd2cSJim Jagielski             aDG.AddLineProperties ();
1409*b1cdbd2cSJim Jagielski             aDG.AddFillProperties ();
1410*b1cdbd2cSJim Jagielski             break;
1411*b1cdbd2cSJim Jagielski 
1412*b1cdbd2cSJim Jagielski         case DRAWING_CONNECTOR:
1413*b1cdbd2cSJim Jagielski         case DRAWING_LINE:
1414*b1cdbd2cSJim Jagielski         case DRAWING_MEASURE:
1415*b1cdbd2cSJim Jagielski         case DRAWING_OPEN_BEZIER:
1416*b1cdbd2cSJim Jagielski         case DRAWING_OPEN_FREEHAND:
1417*b1cdbd2cSJim Jagielski         case DRAWING_POLY_LINE:
1418*b1cdbd2cSJim Jagielski         case DRAWING_POLY_LINE_PATH:
1419*b1cdbd2cSJim Jagielski             aDG.AddLineProperties ();
1420*b1cdbd2cSJim Jagielski             break;
1421*b1cdbd2cSJim Jagielski 
1422*b1cdbd2cSJim Jagielski         case DRAWING_CONTROL:
1423*b1cdbd2cSJim Jagielski             aDG.AddProperty (OUString::createFromAscii ("ControlBackground"),
1424*b1cdbd2cSJim Jagielski                 DescriptionGenerator::COLOR,
1425*b1cdbd2cSJim Jagielski                 OUString());
1426*b1cdbd2cSJim Jagielski             aDG.AddProperty (OUString::createFromAscii ("ControlBorder"),
1427*b1cdbd2cSJim Jagielski                 DescriptionGenerator::INTEGER,
1428*b1cdbd2cSJim Jagielski                 OUString());
1429*b1cdbd2cSJim Jagielski             break;
1430*b1cdbd2cSJim Jagielski 
1431*b1cdbd2cSJim Jagielski         case DRAWING_TEXT:
1432*b1cdbd2cSJim Jagielski             aDG.AddTextProperties ();
1433*b1cdbd2cSJim Jagielski             break;
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski         default:
1436*b1cdbd2cSJim Jagielski             aDG.Initialize (::rtl::OUString (
1437*b1cdbd2cSJim Jagielski                                 RTL_CONSTASCII_USTRINGPARAM("Unknown accessible shape")));
1438*b1cdbd2cSJim Jagielski             uno::Reference<drawing::XShapeDescriptor> xDescriptor (mxShape, uno::UNO_QUERY);
1439*b1cdbd2cSJim Jagielski             if (xDescriptor.is())
1440*b1cdbd2cSJim Jagielski             {
1441*b1cdbd2cSJim Jagielski                 aDG.AppendString (::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("service name=")));
1442*b1cdbd2cSJim Jagielski                 aDG.AppendString (xDescriptor->getShapeType());
1443*b1cdbd2cSJim Jagielski             }
1444*b1cdbd2cSJim Jagielski     }
1445*b1cdbd2cSJim Jagielski 
1446*b1cdbd2cSJim Jagielski     return aDG();
1447*b1cdbd2cSJim Jagielski }
1448*b1cdbd2cSJim Jagielski 
1449*b1cdbd2cSJim Jagielski 
1450*b1cdbd2cSJim Jagielski 
1451*b1cdbd2cSJim Jagielski 
GetXShape()1452*b1cdbd2cSJim Jagielski uno::Reference< drawing::XShape > AccessibleShape::GetXShape()
1453*b1cdbd2cSJim Jagielski {
1454*b1cdbd2cSJim Jagielski     return( mxShape );
1455*b1cdbd2cSJim Jagielski }
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski 
1458*b1cdbd2cSJim Jagielski 
1459*b1cdbd2cSJim Jagielski // protected
disposing(void)1460*b1cdbd2cSJim Jagielski void AccessibleShape::disposing (void)
1461*b1cdbd2cSJim Jagielski {
1462*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
1463*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski     // Make sure to send an event that this object looses the focus in the
1466*b1cdbd2cSJim Jagielski     // case that it has the focus.
1467*b1cdbd2cSJim Jagielski     ::utl::AccessibleStateSetHelper* pStateSet =
1468*b1cdbd2cSJim Jagielski           static_cast< ::utl::AccessibleStateSetHelper*>(mxStateSet.get());
1469*b1cdbd2cSJim Jagielski     if (pStateSet != NULL)
1470*b1cdbd2cSJim Jagielski         pStateSet->RemoveState (AccessibleStateType::FOCUSED);
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski     // Unregister from broadcasters.
1473*b1cdbd2cSJim Jagielski     Reference<lang::XComponent> xComponent (mxShape, uno::UNO_QUERY);
1474*b1cdbd2cSJim Jagielski     if (xComponent.is())
1475*b1cdbd2cSJim Jagielski         xComponent->removeEventListener (this);
1476*b1cdbd2cSJim Jagielski 
1477*b1cdbd2cSJim Jagielski     // Unregister from model.
1478*b1cdbd2cSJim Jagielski     if (maShapeTreeInfo.GetModelBroadcaster().is())
1479*b1cdbd2cSJim Jagielski         maShapeTreeInfo.GetModelBroadcaster()->removeEventListener (
1480*b1cdbd2cSJim Jagielski             static_cast<document::XEventListener*>(this));
1481*b1cdbd2cSJim Jagielski 
1482*b1cdbd2cSJim Jagielski     // Release the child containers.
1483*b1cdbd2cSJim Jagielski     if (mpChildrenManager != NULL)
1484*b1cdbd2cSJim Jagielski     {
1485*b1cdbd2cSJim Jagielski         delete mpChildrenManager;
1486*b1cdbd2cSJim Jagielski         mpChildrenManager = NULL;
1487*b1cdbd2cSJim Jagielski     }
1488*b1cdbd2cSJim Jagielski     if (mpText != NULL)
1489*b1cdbd2cSJim Jagielski     {
1490*b1cdbd2cSJim Jagielski         mpText->Dispose();
1491*b1cdbd2cSJim Jagielski         delete mpText;
1492*b1cdbd2cSJim Jagielski         mpText = NULL;
1493*b1cdbd2cSJim Jagielski     }
1494*b1cdbd2cSJim Jagielski 
1495*b1cdbd2cSJim Jagielski     // Cleanup.  Remove references to objects to allow them to be
1496*b1cdbd2cSJim Jagielski     // destroyed.
1497*b1cdbd2cSJim Jagielski     mxShape = NULL;
1498*b1cdbd2cSJim Jagielski     maShapeTreeInfo = AccessibleShapeTreeInfo();
1499*b1cdbd2cSJim Jagielski 
1500*b1cdbd2cSJim Jagielski     // Call base classes.
1501*b1cdbd2cSJim Jagielski     AccessibleContextBase::dispose ();
1502*b1cdbd2cSJim Jagielski }
1503*b1cdbd2cSJim Jagielski 
1504*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL
getAccessibleIndexInParent(void)1505*b1cdbd2cSJim Jagielski    	AccessibleShape::getAccessibleIndexInParent (void)
1506*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
1507*b1cdbd2cSJim Jagielski {
1508*b1cdbd2cSJim Jagielski     ThrowIfDisposed ();
1509*b1cdbd2cSJim Jagielski 	//	Use a simple but slow solution for now.  Optimize later.
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski 	sal_Int32 nIndex = m_nIndexInParent;
1512*b1cdbd2cSJim Jagielski 	if ( -1 == nIndex )
1513*b1cdbd2cSJim Jagielski 		nIndex = AccessibleContextBase::getAccessibleIndexInParent();
1514*b1cdbd2cSJim Jagielski     return nIndex;
1515*b1cdbd2cSJim Jagielski }
1516*b1cdbd2cSJim Jagielski 
1517*b1cdbd2cSJim Jagielski 
1518*b1cdbd2cSJim Jagielski 
1519*b1cdbd2cSJim Jagielski 
UpdateNameAndDescription(void)1520*b1cdbd2cSJim Jagielski void AccessibleShape::UpdateNameAndDescription (void)
1521*b1cdbd2cSJim Jagielski {
1522*b1cdbd2cSJim Jagielski     // Ignore missing title, name, or description.  There are fallbacks for
1523*b1cdbd2cSJim Jagielski     // them.
1524*b1cdbd2cSJim Jagielski     try
1525*b1cdbd2cSJim Jagielski     {
1526*b1cdbd2cSJim Jagielski         Reference<beans::XPropertySet> xSet (mxShape, uno::UNO_QUERY_THROW);
1527*b1cdbd2cSJim Jagielski         OUString sString;
1528*b1cdbd2cSJim Jagielski 
1529*b1cdbd2cSJim Jagielski         // Get the accessible name.
1530*b1cdbd2cSJim Jagielski         sString = GetOptionalProperty(xSet, OUString(RTL_CONSTASCII_USTRINGPARAM("Title")));
1531*b1cdbd2cSJim Jagielski         if (sString.getLength() > 0)
1532*b1cdbd2cSJim Jagielski         {
1533*b1cdbd2cSJim Jagielski             SetAccessibleName(sString, AccessibleContextBase::FromShape);
1534*b1cdbd2cSJim Jagielski         }
1535*b1cdbd2cSJim Jagielski         else
1536*b1cdbd2cSJim Jagielski         {
1537*b1cdbd2cSJim Jagielski             sString = GetOptionalProperty(xSet, OUString(RTL_CONSTASCII_USTRINGPARAM("Name")));
1538*b1cdbd2cSJim Jagielski             if (sString.getLength() > 0)
1539*b1cdbd2cSJim Jagielski                 SetAccessibleName(sString, AccessibleContextBase::FromShape);
1540*b1cdbd2cSJim Jagielski         }
1541*b1cdbd2cSJim Jagielski 
1542*b1cdbd2cSJim Jagielski         // Get the accessible description.
1543*b1cdbd2cSJim Jagielski         sString = GetOptionalProperty(xSet, OUString(RTL_CONSTASCII_USTRINGPARAM("Description")));
1544*b1cdbd2cSJim Jagielski         if (sString.getLength() > 0)
1545*b1cdbd2cSJim Jagielski             SetAccessibleDescription(sString, AccessibleContextBase::FromShape);
1546*b1cdbd2cSJim Jagielski     }
1547*b1cdbd2cSJim Jagielski     catch (uno::RuntimeException&)
1548*b1cdbd2cSJim Jagielski     {
1549*b1cdbd2cSJim Jagielski     }
1550*b1cdbd2cSJim Jagielski }
1551*b1cdbd2cSJim Jagielski //	Return this object's role.
getAccessibleRole(void)1552*b1cdbd2cSJim Jagielski sal_Int16 SAL_CALL AccessibleShape::getAccessibleRole (void)
1553*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException)
1554*b1cdbd2cSJim Jagielski {
1555*b1cdbd2cSJim Jagielski 	sal_Int16 nAccessibleRole =  AccessibleRole::SHAPE ;
1556*b1cdbd2cSJim Jagielski 	switch (ShapeTypeHandler::Instance().GetTypeId (mxShape))
1557*b1cdbd2cSJim Jagielski     {
1558*b1cdbd2cSJim Jagielski 		case     DRAWING_GRAPHIC_OBJECT:
1559*b1cdbd2cSJim Jagielski 				 nAccessibleRole =  AccessibleRole::GRAPHIC ;				break;
1560*b1cdbd2cSJim Jagielski 		case     DRAWING_OLE:
1561*b1cdbd2cSJim Jagielski 				 nAccessibleRole =  AccessibleRole::EMBEDDED_OBJECT ;		break;
1562*b1cdbd2cSJim Jagielski 
1563*b1cdbd2cSJim Jagielski 		default:
1564*b1cdbd2cSJim Jagielski 			nAccessibleRole = AccessibleContextBase::getAccessibleRole();
1565*b1cdbd2cSJim Jagielski 			break;
1566*b1cdbd2cSJim Jagielski 	}
1567*b1cdbd2cSJim Jagielski 
1568*b1cdbd2cSJim Jagielski 	return nAccessibleRole;
1569*b1cdbd2cSJim Jagielski }
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski 
UpdateDocumentAllSelState(Reference<XAccessibleStateSet> & xStateSet)1572*b1cdbd2cSJim Jagielski void AccessibleShape::UpdateDocumentAllSelState(Reference<XAccessibleStateSet> &xStateSet)
1573*b1cdbd2cSJim Jagielski {
1574*b1cdbd2cSJim Jagielski 	if (mpParent && mpParent->IsDocumentSelAll())
1575*b1cdbd2cSJim Jagielski 	{
1576*b1cdbd2cSJim Jagielski 		::utl::AccessibleStateSetHelper* pStateSet =
1577*b1cdbd2cSJim Jagielski 			static_cast< ::utl::AccessibleStateSetHelper*>(xStateSet.get());
1578*b1cdbd2cSJim Jagielski 		pStateSet->AddState (AccessibleStateType::SELECTED);
1579*b1cdbd2cSJim Jagielski 
1580*b1cdbd2cSJim Jagielski 		//uno::Any NewValue;
1581*b1cdbd2cSJim Jagielski 		//NewValue <<= AccessibleStateType::SELECTED;
1582*b1cdbd2cSJim Jagielski 
1583*b1cdbd2cSJim Jagielski 		//CommitChange(AccessibleEventId::STATE_CHANGED,NewValue,uno::Any());
1584*b1cdbd2cSJim Jagielski 	}
1585*b1cdbd2cSJim Jagielski }
1586*b1cdbd2cSJim Jagielski 
1587*b1cdbd2cSJim Jagielski //sort the drawing objects from up to down, from left to right
1588*b1cdbd2cSJim Jagielski struct XShapePosCompareHelper
1589*b1cdbd2cSJim Jagielski {
operator ()accessibility::XShapePosCompareHelper1590*b1cdbd2cSJim Jagielski     bool operator() ( const uno::Reference<drawing::XShape>& xshape1,
1591*b1cdbd2cSJim Jagielski         const uno::Reference<drawing::XShape>& xshape2 ) const
1592*b1cdbd2cSJim Jagielski     {
1593*b1cdbd2cSJim Jagielski         SdrObject* pObj1 = GetSdrObjectFromXShape(xshape1);
1594*b1cdbd2cSJim Jagielski         SdrObject* pObj2 = GetSdrObjectFromXShape(xshape2);
1595*b1cdbd2cSJim Jagielski         if(pObj1 && pObj2)
1596*b1cdbd2cSJim Jagielski             return pObj1->GetOrdNum() < pObj2->GetOrdNum();
1597*b1cdbd2cSJim Jagielski         else
1598*b1cdbd2cSJim Jagielski             return 0;
1599*b1cdbd2cSJim Jagielski     }
1600*b1cdbd2cSJim Jagielski };
1601*b1cdbd2cSJim Jagielski //end of group position
1602*b1cdbd2cSJim Jagielski 
1603*b1cdbd2cSJim Jagielski //=====  XAccessibleGroupPosition  =========================================
1604*b1cdbd2cSJim Jagielski uno::Sequence< sal_Int32 > SAL_CALL
getGroupPosition(const uno::Any &)1605*b1cdbd2cSJim Jagielski AccessibleShape::getGroupPosition( const uno::Any& )
1606*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
1607*b1cdbd2cSJim Jagielski {
1608*b1cdbd2cSJim Jagielski     // we will return the:
1609*b1cdbd2cSJim Jagielski     // [0] group level
1610*b1cdbd2cSJim Jagielski     // [1] similar items counts in the group
1611*b1cdbd2cSJim Jagielski     // [2] the position of the object in the group
1612*b1cdbd2cSJim Jagielski     uno::Sequence< sal_Int32 > aRet( 3 );
1613*b1cdbd2cSJim Jagielski     aRet[0] = 0;
1614*b1cdbd2cSJim Jagielski     aRet[1] = 0;
1615*b1cdbd2cSJim Jagielski     aRet[2] = 0;
1616*b1cdbd2cSJim Jagielski 
1617*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference<XAccessible> xParent = getAccessibleParent();
1618*b1cdbd2cSJim Jagielski     if (!xParent.is())
1619*b1cdbd2cSJim Jagielski     {
1620*b1cdbd2cSJim Jagielski         return aRet;
1621*b1cdbd2cSJim Jagielski     }
1622*b1cdbd2cSJim Jagielski     SdrObject *pObj = GetSdrObjectFromXShape(mxShape);
1623*b1cdbd2cSJim Jagielski 
1624*b1cdbd2cSJim Jagielski 
1625*b1cdbd2cSJim Jagielski     if(pObj == NULL )
1626*b1cdbd2cSJim Jagielski     {
1627*b1cdbd2cSJim Jagielski         return aRet;
1628*b1cdbd2cSJim Jagielski     }
1629*b1cdbd2cSJim Jagielski 
1630*b1cdbd2cSJim Jagielski     // Compute object's group level.
1631*b1cdbd2cSJim Jagielski     sal_Int32 nGroupLevel = 0;
1632*b1cdbd2cSJim Jagielski     SdrObject * pUper = pObj->GetUpGroup();
1633*b1cdbd2cSJim Jagielski     while( pUper )
1634*b1cdbd2cSJim Jagielski     {
1635*b1cdbd2cSJim Jagielski         ++nGroupLevel;
1636*b1cdbd2cSJim Jagielski         pUper = pUper->GetUpGroup();
1637*b1cdbd2cSJim Jagielski     }
1638*b1cdbd2cSJim Jagielski 
1639*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference<XAccessibleContext> xParentContext = xParent->getAccessibleContext();
1640*b1cdbd2cSJim Jagielski     if( xParentContext->getAccessibleRole()  == AccessibleRole::DOCUMENT)//Document
1641*b1cdbd2cSJim Jagielski     {
1642*b1cdbd2cSJim Jagielski         Reference< XAccessibleGroupPosition > xGroupPosition( xParent,uno::UNO_QUERY );
1643*b1cdbd2cSJim Jagielski         if ( xGroupPosition.is() )
1644*b1cdbd2cSJim Jagielski         {
1645*b1cdbd2cSJim Jagielski             aRet = xGroupPosition->getGroupPosition( uno::makeAny( getAccessibleContext() ) );
1646*b1cdbd2cSJim Jagielski         }
1647*b1cdbd2cSJim Jagielski         return aRet;
1648*b1cdbd2cSJim Jagielski     }
1649*b1cdbd2cSJim Jagielski     if (xParentContext->getAccessibleRole() != AccessibleRole::SHAPE)
1650*b1cdbd2cSJim Jagielski     {
1651*b1cdbd2cSJim Jagielski         return aRet;
1652*b1cdbd2cSJim Jagielski     }
1653*b1cdbd2cSJim Jagielski 
1654*b1cdbd2cSJim Jagielski 	SdrObjList *pGrpList = NULL;
1655*b1cdbd2cSJim Jagielski 	if( pObj->GetUpGroup() )
1656*b1cdbd2cSJim Jagielski 		pGrpList = pObj->GetUpGroup()->GetSubList();
1657*b1cdbd2cSJim Jagielski 	else
1658*b1cdbd2cSJim Jagielski 		return aRet;
1659*b1cdbd2cSJim Jagielski 
1660*b1cdbd2cSJim Jagielski 	std::vector< uno::Reference<drawing::XShape> > vXShapes;
1661*b1cdbd2cSJim Jagielski     if (pGrpList)
1662*b1cdbd2cSJim Jagielski     {
1663*b1cdbd2cSJim Jagielski         const sal_Int32 nObj = pGrpList->GetObjCount();
1664*b1cdbd2cSJim Jagielski         for(sal_Int32 i = 0 ; i < nObj ; ++i)
1665*b1cdbd2cSJim Jagielski         {
1666*b1cdbd2cSJim Jagielski             SdrObject *pSubObj = pGrpList->GetObj(i);
1667*b1cdbd2cSJim Jagielski             if (pSubObj &&
1668*b1cdbd2cSJim Jagielski 				xParentContext->getAccessibleChild(i)->getAccessibleContext()->getAccessibleRole() != AccessibleRole::GROUP_BOX)
1669*b1cdbd2cSJim Jagielski             {
1670*b1cdbd2cSJim Jagielski 				vXShapes.push_back( GetXShapeForSdrObject(pSubObj) );
1671*b1cdbd2cSJim Jagielski             }
1672*b1cdbd2cSJim Jagielski         }
1673*b1cdbd2cSJim Jagielski     }
1674*b1cdbd2cSJim Jagielski 
1675*b1cdbd2cSJim Jagielski     std::sort( vXShapes.begin(), vXShapes.end(), XShapePosCompareHelper() );
1676*b1cdbd2cSJim Jagielski 
1677*b1cdbd2cSJim Jagielski     //get the the index of the selected object in the group
1678*b1cdbd2cSJim Jagielski     std::vector< uno::Reference<drawing::XShape> >::iterator aIter;
1679*b1cdbd2cSJim Jagielski     //we start counting position from 1
1680*b1cdbd2cSJim Jagielski     sal_Int32 nPos = 1;
1681*b1cdbd2cSJim Jagielski     for ( aIter = vXShapes.begin(); aIter != vXShapes.end(); aIter++, nPos++ )
1682*b1cdbd2cSJim Jagielski     {
1683*b1cdbd2cSJim Jagielski         if ( (*aIter).get() == mxShape.get() )
1684*b1cdbd2cSJim Jagielski         {
1685*b1cdbd2cSJim Jagielski             sal_Int32* pArray = aRet.getArray();
1686*b1cdbd2cSJim Jagielski             pArray[0] = nGroupLevel;
1687*b1cdbd2cSJim Jagielski             pArray[1] = vXShapes.size();
1688*b1cdbd2cSJim Jagielski             pArray[2] = nPos;
1689*b1cdbd2cSJim Jagielski             break;
1690*b1cdbd2cSJim Jagielski         }
1691*b1cdbd2cSJim Jagielski     }
1692*b1cdbd2cSJim Jagielski 
1693*b1cdbd2cSJim Jagielski     return aRet;
1694*b1cdbd2cSJim Jagielski }
1695*b1cdbd2cSJim Jagielski 
getObjectLink(const uno::Any &)1696*b1cdbd2cSJim Jagielski ::rtl::OUString AccessibleShape::getObjectLink( const uno::Any& )
1697*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
1698*b1cdbd2cSJim Jagielski {
1699*b1cdbd2cSJim Jagielski     ::rtl::OUString aRet;
1700*b1cdbd2cSJim Jagielski 
1701*b1cdbd2cSJim Jagielski     SdrObject *pObj = GetSdrObjectFromXShape(mxShape);
1702*b1cdbd2cSJim Jagielski     if(pObj == NULL )
1703*b1cdbd2cSJim Jagielski     {
1704*b1cdbd2cSJim Jagielski         return aRet;
1705*b1cdbd2cSJim Jagielski     }
1706*b1cdbd2cSJim Jagielski 	if (maShapeTreeInfo.GetDocumentWindow().is())
1707*b1cdbd2cSJim Jagielski 	{
1708*b1cdbd2cSJim Jagielski 		Reference< XAccessibleGroupPosition > xGroupPosition( maShapeTreeInfo.GetDocumentWindow(), uno::UNO_QUERY );
1709*b1cdbd2cSJim Jagielski 		if (xGroupPosition.is())
1710*b1cdbd2cSJim Jagielski 		{
1711*b1cdbd2cSJim Jagielski 			aRet = xGroupPosition->getObjectLink( uno::makeAny( getAccessibleContext() ) );
1712*b1cdbd2cSJim Jagielski 		}
1713*b1cdbd2cSJim Jagielski 	}
1714*b1cdbd2cSJim Jagielski 	return aRet;
1715*b1cdbd2cSJim Jagielski }
1716*b1cdbd2cSJim Jagielski 
1717*b1cdbd2cSJim Jagielski //=====  XAccesibleHypertext  ==================================================
getHyperLinkCount()1718*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getHyperLinkCount()
1719*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::RuntimeException)
1720*b1cdbd2cSJim Jagielski {
1721*b1cdbd2cSJim Jagielski 	// MT: Introduced with IA2 CWS, but SvxAccessibleHyperlink was redundant to svx::AccessibleHyperlink which we introduced meanwhile.
1722*b1cdbd2cSJim Jagielski 	// Code need to be adapted....
1723*b1cdbd2cSJim Jagielski 	return 0;
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski 	/*
1726*b1cdbd2cSJim Jagielski 	SvxAccessibleHyperlink* pLink = new SvxAccessibleHyperlink(m_pShape,this);
1727*b1cdbd2cSJim Jagielski 	if (pLink->IsValidHyperlink())
1728*b1cdbd2cSJim Jagielski 		return 1;
1729*b1cdbd2cSJim Jagielski 	else
1730*b1cdbd2cSJim Jagielski 		return 0;
1731*b1cdbd2cSJim Jagielski 	*/
1732*b1cdbd2cSJim Jagielski }
1733*b1cdbd2cSJim Jagielski uno::Reference< XAccessibleHyperlink > SAL_CALL
getHyperLink(sal_Int32)1734*b1cdbd2cSJim Jagielski 	AccessibleShape::getHyperLink( sal_Int32 )
1735*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1736*b1cdbd2cSJim Jagielski {
1737*b1cdbd2cSJim Jagielski 	uno::Reference< XAccessibleHyperlink > xRet;
1738*b1cdbd2cSJim Jagielski 	// MT: Introduced with IA2 CWS, but SvxAccessibleHyperlink was redundant to svx::AccessibleHyperlink which we introduced meanwhile.
1739*b1cdbd2cSJim Jagielski 	// Code need to be adapted....
1740*b1cdbd2cSJim Jagielski 	/*
1741*b1cdbd2cSJim Jagielski 	SvxAccessibleHyperlink* pLink = new SvxAccessibleHyperlink(m_pShape,this);
1742*b1cdbd2cSJim Jagielski 	if (pLink->IsValidHyperlink())
1743*b1cdbd2cSJim Jagielski 		xRet = pLink;
1744*b1cdbd2cSJim Jagielski 	if( !xRet.is() )
1745*b1cdbd2cSJim Jagielski 		throw ::com::sun::star::lang::IndexOutOfBoundsException();
1746*b1cdbd2cSJim Jagielski 	*/
1747*b1cdbd2cSJim Jagielski 	return xRet;
1748*b1cdbd2cSJim Jagielski }
getHyperLinkIndex(sal_Int32)1749*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getHyperLinkIndex( sal_Int32 )
1750*b1cdbd2cSJim Jagielski throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1751*b1cdbd2cSJim Jagielski {
1752*b1cdbd2cSJim Jagielski 	sal_Int32 nRet = 0;
1753*b1cdbd2cSJim Jagielski 	return nRet;
1754*b1cdbd2cSJim Jagielski }
1755*b1cdbd2cSJim Jagielski //=====  XAccesibleText  ==================================================
getCaretPosition()1756*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getCaretPosition(  ) throw (::com::sun::star::uno::RuntimeException){return 0;}
setCaretPosition(sal_Int32)1757*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleShape::setCaretPosition( sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException){return 0;}
getCharacter(sal_Int32)1758*b1cdbd2cSJim Jagielski sal_Unicode SAL_CALL AccessibleShape::getCharacter( sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException){return 0;}
getCharacterAttributes(sal_Int32,const::com::sun::star::uno::Sequence<::rtl::OUString> &)1759*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL AccessibleShape::getCharacterAttributes( sal_Int32, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1760*b1cdbd2cSJim Jagielski {
1761*b1cdbd2cSJim Jagielski 	uno::Sequence< ::com::sun::star::beans::PropertyValue > aValues(0);
1762*b1cdbd2cSJim Jagielski 	return aValues;
1763*b1cdbd2cSJim Jagielski }
getCharacterBounds(sal_Int32)1764*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Rectangle SAL_CALL AccessibleShape::getCharacterBounds( sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1765*b1cdbd2cSJim Jagielski {
1766*b1cdbd2cSJim Jagielski     return com::sun::star::awt::Rectangle(0, 0, 0, 0 );
1767*b1cdbd2cSJim Jagielski }
getCharacterCount()1768*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getCharacterCount(  ) throw (::com::sun::star::uno::RuntimeException){return 0;}
getIndexAtPoint(const::com::sun::star::awt::Point &)1769*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getIndexAtPoint( const ::com::sun::star::awt::Point& ) throw (::com::sun::star::uno::RuntimeException){return 0;}
getSelectedText()1770*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL AccessibleShape::getSelectedText(  ) throw (::com::sun::star::uno::RuntimeException){return OUString();}
getSelectionStart()1771*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getSelectionStart(  ) throw (::com::sun::star::uno::RuntimeException){return 0;}
getSelectionEnd()1772*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleShape::getSelectionEnd(  ) throw (::com::sun::star::uno::RuntimeException){return 0;}
setSelection(sal_Int32,sal_Int32)1773*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleShape::setSelection( sal_Int32, sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException){return sal_True;}
getText()1774*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL AccessibleShape::getText(  ) throw (::com::sun::star::uno::RuntimeException){return OUString();}
getTextRange(sal_Int32,sal_Int32)1775*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL AccessibleShape::getTextRange( sal_Int32, sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException){return OUString();}
getTextAtIndex(sal_Int32,sal_Int16)1776*b1cdbd2cSJim Jagielski ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleShape::getTextAtIndex( sal_Int32, sal_Int16 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
1777*b1cdbd2cSJim Jagielski {
1778*b1cdbd2cSJim Jagielski 	::com::sun::star::accessibility::TextSegment aResult;
1779*b1cdbd2cSJim Jagielski 	return aResult;
1780*b1cdbd2cSJim Jagielski }
getTextBeforeIndex(sal_Int32,sal_Int16)1781*b1cdbd2cSJim Jagielski ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleShape::getTextBeforeIndex( sal_Int32, sal_Int16 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
1782*b1cdbd2cSJim Jagielski {
1783*b1cdbd2cSJim Jagielski 	::com::sun::star::accessibility::TextSegment aResult;
1784*b1cdbd2cSJim Jagielski     return aResult;
1785*b1cdbd2cSJim Jagielski }
getTextBehindIndex(sal_Int32,sal_Int16)1786*b1cdbd2cSJim Jagielski ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleShape::getTextBehindIndex( sal_Int32, sal_Int16 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
1787*b1cdbd2cSJim Jagielski {
1788*b1cdbd2cSJim Jagielski 	::com::sun::star::accessibility::TextSegment aResult;
1789*b1cdbd2cSJim Jagielski     return aResult;
1790*b1cdbd2cSJim Jagielski }
copyText(sal_Int32,sal_Int32)1791*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleShape::copyText( sal_Int32, sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException){return sal_True;}
1792*b1cdbd2cSJim Jagielski 
1793*b1cdbd2cSJim Jagielski } // end of namespace accessibility
1794