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