1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*f6e50924SAndrew Rist * distributed with this work for additional information
6*f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at
10*f6e50924SAndrew Rist *
11*f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist *
13*f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist * KIND, either express or implied. See the License for the
17*f6e50924SAndrew Rist * specific language governing permissions and limitations
18*f6e50924SAndrew Rist * under the License.
19*f6e50924SAndrew Rist *
20*f6e50924SAndrew Rist *************************************************************/
21*f6e50924SAndrew Rist
22*f6e50924SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
27cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
28cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
29cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
30cdf0e10cSrcweir #include <com/sun/star/beans/PropertyChangeEvent.hpp>
31cdf0e10cSrcweir #include <com/sun/star/awt/XWindow.hpp>
32cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
33cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
34cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
35cdf0e10cSrcweir #include <vcl/svapp.hxx>
36cdf0e10cSrcweir #include <osl/mutex.hxx>
37cdf0e10cSrcweir #include <rtl/uuid.h>
38cdf0e10cSrcweir #include <tools/debug.hxx>
39cdf0e10cSrcweir #include <tools/gen.hxx>
40cdf0e10cSrcweir #include <svl/smplhint.hxx>
41cdf0e10cSrcweir #include <toolkit/helper/convert.hxx>
42cdf0e10cSrcweir #include <svtools/colorcfg.hxx>
43cdf0e10cSrcweir #include <comphelper/accessibleeventnotifier.hxx>
44cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx>
45cdf0e10cSrcweir
46cdf0e10cSrcweir //===== local includes ========================================================
47cdf0e10cSrcweir #include <svx/ShapeTypeHandler.hxx>
48cdf0e10cSrcweir #include <svx/AccessibleShapeInfo.hxx>
49cdf0e10cSrcweir #include "GraphCtlAccessibleContext.hxx"
50cdf0e10cSrcweir #include <svx/graphctl.hxx>
51cdf0e10cSrcweir #ifndef _SVX_DIALOGS_HRC
52cdf0e10cSrcweir #include <svx/dialogs.hrc>
53cdf0e10cSrcweir #endif
54cdf0e10cSrcweir #ifndef _SVX_ACCESSIBILITY_HRC
55cdf0e10cSrcweir #include "accessibility.hrc"
56cdf0e10cSrcweir #endif
57cdf0e10cSrcweir #include <svx/svdpage.hxx>
58cdf0e10cSrcweir #include <svx/unomod.hxx>
59cdf0e10cSrcweir #include <svx/dialmgr.hxx>
60cdf0e10cSrcweir #include <svx/svdetc.hxx>
61cdf0e10cSrcweir #include <svx/sdrhittesthelper.hxx>
62cdf0e10cSrcweir
63cdf0e10cSrcweir //===== namespaces ===========================================================
64cdf0e10cSrcweir
65cdf0e10cSrcweir using namespace ::vos;
66cdf0e10cSrcweir using namespace ::cppu;
67cdf0e10cSrcweir using namespace ::osl;
68cdf0e10cSrcweir using ::rtl::OUString;
69cdf0e10cSrcweir using namespace ::accessibility;
70cdf0e10cSrcweir using namespace ::com::sun::star;
71cdf0e10cSrcweir using namespace ::com::sun::star::uno;
72cdf0e10cSrcweir using namespace ::com::sun::star::drawing;
73cdf0e10cSrcweir using namespace ::com::sun::star::lang;
74cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
75cdf0e10cSrcweir
76cdf0e10cSrcweir //===== internal ============================================================
77cdf0e10cSrcweir
78cdf0e10cSrcweir /** initialize this component and set default values */
SvxGraphCtrlAccessibleContext(const Reference<XAccessible> & rxParent,GraphCtrl & rRepr,const OUString * pName,const OUString * pDesc)79cdf0e10cSrcweir SvxGraphCtrlAccessibleContext::SvxGraphCtrlAccessibleContext(
80cdf0e10cSrcweir const Reference< XAccessible >& rxParent,
81cdf0e10cSrcweir GraphCtrl& rRepr,
82cdf0e10cSrcweir const OUString* pName,
83cdf0e10cSrcweir const OUString* pDesc ) :
84cdf0e10cSrcweir
85cdf0e10cSrcweir SvxGraphCtrlAccessibleContext_Base( m_aMutex ),
86cdf0e10cSrcweir mxParent( rxParent ),
87cdf0e10cSrcweir mpControl( &rRepr ),
88cdf0e10cSrcweir mpModel (NULL),
89cdf0e10cSrcweir mpPage (NULL),
90cdf0e10cSrcweir mpView (NULL),
91cdf0e10cSrcweir mnClientId( 0 ),
92cdf0e10cSrcweir mbDisposed( sal_False )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir if (mpControl != NULL)
95cdf0e10cSrcweir {
96cdf0e10cSrcweir mpModel = mpControl->GetSdrModel();
97cdf0e10cSrcweir if (mpModel != NULL)
98cdf0e10cSrcweir mpPage = (SdrPage*)mpModel->GetPage( 0 );
99cdf0e10cSrcweir mpView = mpControl->GetSdrView();
100cdf0e10cSrcweir
101cdf0e10cSrcweir if( mpModel == NULL || mpPage == NULL || mpView == NULL )
102cdf0e10cSrcweir {
103cdf0e10cSrcweir mbDisposed = true;
104cdf0e10cSrcweir // Set all the pointers to NULL just in case they are used as
105cdf0e10cSrcweir // a disposed flag.
106cdf0e10cSrcweir mpModel = NULL;
107cdf0e10cSrcweir mpPage = NULL;
108cdf0e10cSrcweir mpView = NULL;
109cdf0e10cSrcweir }
110cdf0e10cSrcweir }
111cdf0e10cSrcweir
112cdf0e10cSrcweir if( pName )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir msName = *pName;
115cdf0e10cSrcweir }
116cdf0e10cSrcweir else
117cdf0e10cSrcweir {
118cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
119cdf0e10cSrcweir msName = SVX_RESSTR( RID_SVXSTR_GRAPHCTRL_ACC_NAME );
120cdf0e10cSrcweir }
121cdf0e10cSrcweir
122cdf0e10cSrcweir if( pDesc )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir msDescription = *pDesc;
125cdf0e10cSrcweir }
126cdf0e10cSrcweir else
127cdf0e10cSrcweir {
128cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
129cdf0e10cSrcweir msDescription = SVX_RESSTR( RID_SVXSTR_GRAPHCTRL_ACC_DESCRIPTION );
130cdf0e10cSrcweir }
131cdf0e10cSrcweir
132cdf0e10cSrcweir maTreeInfo.SetSdrView( mpView );
133cdf0e10cSrcweir maTreeInfo.SetWindow( mpControl );
134cdf0e10cSrcweir maTreeInfo.SetViewForwarder( const_cast<SvxGraphCtrlAccessibleContext*>(this) );
135cdf0e10cSrcweir }
136cdf0e10cSrcweir
137cdf0e10cSrcweir //-----------------------------------------------------------------------------
138cdf0e10cSrcweir
139cdf0e10cSrcweir /** on destruction, this component is disposed and all dispose listeners
140cdf0e10cSrcweir are called, except if this component was already disposed */
~SvxGraphCtrlAccessibleContext()141cdf0e10cSrcweir SvxGraphCtrlAccessibleContext::~SvxGraphCtrlAccessibleContext()
142cdf0e10cSrcweir {
143cdf0e10cSrcweir disposing();
144cdf0e10cSrcweir }
145cdf0e10cSrcweir
146cdf0e10cSrcweir //-----------------------------------------------------------------------------
147cdf0e10cSrcweir
148cdf0e10cSrcweir /** returns the XAccessible interface for a given SdrObject.
149cdf0e10cSrcweir Multiple calls for the same SdrObject return the same XAccessible.
150cdf0e10cSrcweir */
getAccessible(const SdrObject * pObj)151cdf0e10cSrcweir Reference< XAccessible > SAL_CALL SvxGraphCtrlAccessibleContext::getAccessible( const SdrObject* pObj )
152cdf0e10cSrcweir {
153cdf0e10cSrcweir Reference<XAccessible> xAccessibleShape;
154cdf0e10cSrcweir
155cdf0e10cSrcweir if( pObj )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir // see if we already created an XAccessible for the given SdrObject
158cdf0e10cSrcweir ShapesMapType::iterator iter = mxShapes.find( pObj );
159cdf0e10cSrcweir
160cdf0e10cSrcweir if( iter != mxShapes.end() )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir // if we already have one, return it
163cdf0e10cSrcweir xAccessibleShape = (*iter).second;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir else
166cdf0e10cSrcweir {
167cdf0e10cSrcweir // create a new one and remember in our internal map
168cdf0e10cSrcweir Reference< XShape > xShape( Reference< XShape >::query( (const_cast<SdrObject*>(pObj))->getUnoShape() ) );
169cdf0e10cSrcweir
170cdf0e10cSrcweir AccessibleShapeInfo aShapeInfo (xShape,mxParent);
171cdf0e10cSrcweir // Create accessible object that corresponds to the descriptor's shape.
172cdf0e10cSrcweir AccessibleShape* pAcc = ShapeTypeHandler::Instance().CreateAccessibleObject(
173cdf0e10cSrcweir aShapeInfo, maTreeInfo);
174cdf0e10cSrcweir xAccessibleShape = pAcc;
175cdf0e10cSrcweir if (pAcc != NULL)
176cdf0e10cSrcweir {
177cdf0e10cSrcweir pAcc->acquire();
178cdf0e10cSrcweir // Now that we acquired the new accessible shape we can
179cdf0e10cSrcweir // safely call its Init() method.
180cdf0e10cSrcweir pAcc->Init ();
181cdf0e10cSrcweir }
182cdf0e10cSrcweir mxShapes[pObj] = pAcc;
183cdf0e10cSrcweir
184cdf0e10cSrcweir // Create event and inform listeners of the object creation.
185cdf0e10cSrcweir CommitChange( AccessibleEventId::CHILD, makeAny( xAccessibleShape ), makeAny( Reference<XAccessible>() ) );
186cdf0e10cSrcweir }
187cdf0e10cSrcweir }
188cdf0e10cSrcweir
189cdf0e10cSrcweir return xAccessibleShape;
190cdf0e10cSrcweir }
191cdf0e10cSrcweir
192cdf0e10cSrcweir //===== XAccessible =========================================================
193cdf0e10cSrcweir
getAccessibleContext(void)194cdf0e10cSrcweir Reference< XAccessibleContext > SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleContext( void ) throw( RuntimeException )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir return this;
197cdf0e10cSrcweir }
198cdf0e10cSrcweir
199cdf0e10cSrcweir //===== XAccessibleComponent ================================================
200cdf0e10cSrcweir
containsPoint(const awt::Point & rPoint)201cdf0e10cSrcweir sal_Bool SAL_CALL SvxGraphCtrlAccessibleContext::containsPoint( const awt::Point& rPoint ) throw( RuntimeException )
202cdf0e10cSrcweir {
203cdf0e10cSrcweir // no guard -> done in getSize()
204cdf0e10cSrcweir awt::Size aSize (getSize());
205cdf0e10cSrcweir return (rPoint.X >= 0)
206cdf0e10cSrcweir && (rPoint.X < aSize.Width)
207cdf0e10cSrcweir && (rPoint.Y >= 0)
208cdf0e10cSrcweir && (rPoint.Y < aSize.Height);
209cdf0e10cSrcweir }
210cdf0e10cSrcweir
211cdf0e10cSrcweir //-----------------------------------------------------------------------------
212cdf0e10cSrcweir
getAccessibleAtPoint(const awt::Point & rPoint)213cdf0e10cSrcweir Reference< XAccessible > SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleAtPoint( const awt::Point& rPoint ) throw( RuntimeException )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
216cdf0e10cSrcweir
217cdf0e10cSrcweir Reference< XAccessible > xAccessible;
218cdf0e10cSrcweir
219cdf0e10cSrcweir if( mpControl )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir Point aPnt( rPoint.X, rPoint.Y );
222cdf0e10cSrcweir mpControl->PixelToLogic( aPnt );
223cdf0e10cSrcweir
224cdf0e10cSrcweir SdrObject* pObj = 0;
225cdf0e10cSrcweir
226cdf0e10cSrcweir if(mpView && mpView->GetSdrPageView())
227cdf0e10cSrcweir {
228cdf0e10cSrcweir pObj = SdrObjListPrimitiveHit(*mpPage, aPnt, 1, *mpView->GetSdrPageView(), 0, false);
229cdf0e10cSrcweir }
230cdf0e10cSrcweir
231cdf0e10cSrcweir if( pObj )
232cdf0e10cSrcweir xAccessible = getAccessible( pObj );
233cdf0e10cSrcweir }
234cdf0e10cSrcweir else
235cdf0e10cSrcweir {
236cdf0e10cSrcweir throw DisposedException();
237cdf0e10cSrcweir }
238cdf0e10cSrcweir
239cdf0e10cSrcweir return xAccessible;
240cdf0e10cSrcweir }
241cdf0e10cSrcweir
242cdf0e10cSrcweir //-----------------------------------------------------------------------------
243cdf0e10cSrcweir
getBounds()244cdf0e10cSrcweir awt::Rectangle SAL_CALL SvxGraphCtrlAccessibleContext::getBounds() throw( RuntimeException )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir // no guard -> done in GetBoundingBox()
247cdf0e10cSrcweir Rectangle aCoreBounds( GetBoundingBox() );
248cdf0e10cSrcweir awt::Rectangle aBounds;
249cdf0e10cSrcweir aBounds.X = aCoreBounds.getX();
250cdf0e10cSrcweir aBounds.Y = aCoreBounds.getY();
251cdf0e10cSrcweir aBounds.Width = aCoreBounds.getWidth();
252cdf0e10cSrcweir aBounds.Height = aCoreBounds.getHeight();
253cdf0e10cSrcweir return aBounds;
254cdf0e10cSrcweir }
255cdf0e10cSrcweir
256cdf0e10cSrcweir //-----------------------------------------------------------------------------
257cdf0e10cSrcweir
getLocation()258cdf0e10cSrcweir awt::Point SAL_CALL SvxGraphCtrlAccessibleContext::getLocation() throw( RuntimeException )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir // no guard -> done in GetBoundingBox()
261cdf0e10cSrcweir Rectangle aRect( GetBoundingBox() );
262cdf0e10cSrcweir return awt::Point( aRect.getX(), aRect.getY() );
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir //-----------------------------------------------------------------------------
266cdf0e10cSrcweir
getLocationOnScreen()267cdf0e10cSrcweir awt::Point SAL_CALL SvxGraphCtrlAccessibleContext::getLocationOnScreen() throw( RuntimeException )
268cdf0e10cSrcweir {
269cdf0e10cSrcweir // no guard -> done in GetBoundingBoxOnScreen()
270cdf0e10cSrcweir Rectangle aRect( GetBoundingBoxOnScreen() );
271cdf0e10cSrcweir return awt::Point( aRect.getX(), aRect.getY() );
272cdf0e10cSrcweir }
273cdf0e10cSrcweir
274cdf0e10cSrcweir //-----------------------------------------------------------------------------
275cdf0e10cSrcweir
getSize()276cdf0e10cSrcweir awt::Size SAL_CALL SvxGraphCtrlAccessibleContext::getSize() throw( RuntimeException )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir // no guard -> done in GetBoundingBox()
279cdf0e10cSrcweir Rectangle aRect( GetBoundingBox() );
280cdf0e10cSrcweir return awt::Size( aRect.getWidth(), aRect.getHeight() );
281cdf0e10cSrcweir }
282cdf0e10cSrcweir
283cdf0e10cSrcweir
284cdf0e10cSrcweir //===== XAccessibleContext ==================================================
285cdf0e10cSrcweir
getAccessibleChildCount(void)286cdf0e10cSrcweir sal_Int32 SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleChildCount( void ) throw( RuntimeException )
287cdf0e10cSrcweir {
288cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
289cdf0e10cSrcweir
290cdf0e10cSrcweir if( NULL == mpPage )
291cdf0e10cSrcweir throw DisposedException();
292cdf0e10cSrcweir
293cdf0e10cSrcweir return mpPage->GetObjCount();
294cdf0e10cSrcweir }
295cdf0e10cSrcweir
296cdf0e10cSrcweir //-----------------------------------------------------------------------------
297cdf0e10cSrcweir
298cdf0e10cSrcweir /** returns the SdrObject at index nIndex from the model of this graph */
getSdrObject(sal_Int32 nIndex)299cdf0e10cSrcweir SdrObject* SvxGraphCtrlAccessibleContext::getSdrObject( sal_Int32 nIndex )
300cdf0e10cSrcweir throw( RuntimeException, lang::IndexOutOfBoundsException )
301cdf0e10cSrcweir {
302cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
303cdf0e10cSrcweir
304cdf0e10cSrcweir if( NULL == mpPage )
305cdf0e10cSrcweir throw DisposedException();
306cdf0e10cSrcweir
307cdf0e10cSrcweir if( (nIndex < 0) || ( static_cast<sal_uInt32>(nIndex) >= mpPage->GetObjCount() ) )
308cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
309cdf0e10cSrcweir
310cdf0e10cSrcweir return mpPage->GetObj( nIndex );
311cdf0e10cSrcweir }
312cdf0e10cSrcweir
313cdf0e10cSrcweir //-----------------------------------------------------------------------------
314cdf0e10cSrcweir
315cdf0e10cSrcweir /** sends an AccessibleEventObject to all added XAccessibleEventListeners */
CommitChange(sal_Int16 nEventId,const uno::Any & rNewValue,const uno::Any & rOldValue)316cdf0e10cSrcweir void SvxGraphCtrlAccessibleContext::CommitChange (
317cdf0e10cSrcweir sal_Int16 nEventId,
318cdf0e10cSrcweir const uno::Any& rNewValue,
319cdf0e10cSrcweir const uno::Any& rOldValue)
320cdf0e10cSrcweir {
321cdf0e10cSrcweir AccessibleEventObject aEvent (
322cdf0e10cSrcweir static_cast<uno::XWeak*>(this),
323cdf0e10cSrcweir nEventId,
324cdf0e10cSrcweir rNewValue,
325cdf0e10cSrcweir rOldValue);
326cdf0e10cSrcweir
327cdf0e10cSrcweir FireEvent (aEvent);
328cdf0e10cSrcweir }
329cdf0e10cSrcweir
330cdf0e10cSrcweir /** sends an AccessibleEventObject to all added XAccessibleEventListeners */
FireEvent(const AccessibleEventObject & aEvent)331cdf0e10cSrcweir void SvxGraphCtrlAccessibleContext::FireEvent (const AccessibleEventObject& aEvent)
332cdf0e10cSrcweir {
333cdf0e10cSrcweir if (mnClientId)
334cdf0e10cSrcweir comphelper::AccessibleEventNotifier::addEvent( mnClientId, aEvent );
335cdf0e10cSrcweir }
336cdf0e10cSrcweir
337cdf0e10cSrcweir //-----------------------------------------------------------------------------
338cdf0e10cSrcweir
getAccessibleChild(sal_Int32 nIndex)339cdf0e10cSrcweir Reference< XAccessible > SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleChild( sal_Int32 nIndex )
340cdf0e10cSrcweir throw( RuntimeException, lang::IndexOutOfBoundsException )
341cdf0e10cSrcweir {
342cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
343cdf0e10cSrcweir
344cdf0e10cSrcweir return getAccessible( getSdrObject( nIndex ) );
345cdf0e10cSrcweir }
346cdf0e10cSrcweir
347cdf0e10cSrcweir //-----------------------------------------------------------------------------
348cdf0e10cSrcweir
getAccessibleParent(void)349cdf0e10cSrcweir Reference< XAccessible > SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleParent( void ) throw( RuntimeException )
350cdf0e10cSrcweir {
351cdf0e10cSrcweir return mxParent;
352cdf0e10cSrcweir }
353cdf0e10cSrcweir
354cdf0e10cSrcweir //-----------------------------------------------------------------------------
355cdf0e10cSrcweir
getAccessibleIndexInParent(void)356cdf0e10cSrcweir sal_Int32 SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleIndexInParent( void ) throw( RuntimeException )
357cdf0e10cSrcweir {
358cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
359cdf0e10cSrcweir // Use a simple but slow solution for now. Optimize later.
360cdf0e10cSrcweir
361cdf0e10cSrcweir // Iterate over all the parent's children and search for this object.
362cdf0e10cSrcweir if( mxParent.is() )
363cdf0e10cSrcweir {
364cdf0e10cSrcweir Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() );
365cdf0e10cSrcweir if( xParentContext.is() )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir sal_Int32 nChildCount = xParentContext->getAccessibleChildCount();
368cdf0e10cSrcweir for( sal_Int32 i = 0 ; i < nChildCount ; ++i )
369cdf0e10cSrcweir {
370cdf0e10cSrcweir Reference< XAccessible > xChild( xParentContext->getAccessibleChild( i ) );
371cdf0e10cSrcweir if( xChild.is() )
372cdf0e10cSrcweir {
373cdf0e10cSrcweir Reference< XAccessibleContext > xChildContext = xChild->getAccessibleContext();
374cdf0e10cSrcweir if( xChildContext == ( XAccessibleContext* ) this )
375cdf0e10cSrcweir return i;
376cdf0e10cSrcweir }
377cdf0e10cSrcweir }
378cdf0e10cSrcweir }
379cdf0e10cSrcweir }
380cdf0e10cSrcweir
381cdf0e10cSrcweir // Return -1 to indicate that this object's parent does not know about the
382cdf0e10cSrcweir // object.
383cdf0e10cSrcweir return -1;
384cdf0e10cSrcweir }
385cdf0e10cSrcweir
386cdf0e10cSrcweir //-----------------------------------------------------------------------------
387cdf0e10cSrcweir
getAccessibleRole(void)388cdf0e10cSrcweir sal_Int16 SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleRole( void ) throw( RuntimeException )
389cdf0e10cSrcweir {
390cdf0e10cSrcweir return AccessibleRole::PANEL;
391cdf0e10cSrcweir }
392cdf0e10cSrcweir
393cdf0e10cSrcweir //-----------------------------------------------------------------------------
394cdf0e10cSrcweir
getAccessibleDescription(void)395cdf0e10cSrcweir OUString SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleDescription( void ) throw( RuntimeException )
396cdf0e10cSrcweir {
397cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
398cdf0e10cSrcweir return msDescription;
399cdf0e10cSrcweir }
400cdf0e10cSrcweir
401cdf0e10cSrcweir //-----------------------------------------------------------------------------
402cdf0e10cSrcweir
getAccessibleName(void)403cdf0e10cSrcweir OUString SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleName( void ) throw( RuntimeException )
404cdf0e10cSrcweir {
405cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
406cdf0e10cSrcweir return msName;
407cdf0e10cSrcweir }
408cdf0e10cSrcweir
409cdf0e10cSrcweir //-----------------------------------------------------------------------------
410cdf0e10cSrcweir
411cdf0e10cSrcweir /** Return empty reference to indicate that the relation set is not
412cdf0e10cSrcweir supported.
413cdf0e10cSrcweir */
getAccessibleRelationSet(void)414cdf0e10cSrcweir Reference< XAccessibleRelationSet > SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleRelationSet( void ) throw( RuntimeException )
415cdf0e10cSrcweir {
416cdf0e10cSrcweir return Reference< XAccessibleRelationSet >();
417cdf0e10cSrcweir }
418cdf0e10cSrcweir
419cdf0e10cSrcweir //-----------------------------------------------------------------------------
420cdf0e10cSrcweir
getAccessibleStateSet(void)421cdf0e10cSrcweir Reference< XAccessibleStateSet > SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleStateSet( void ) throw( RuntimeException )
422cdf0e10cSrcweir {
423cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
424cdf0e10cSrcweir
425cdf0e10cSrcweir utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
426cdf0e10cSrcweir
427cdf0e10cSrcweir if ( rBHelper.bDisposed || mbDisposed )
428cdf0e10cSrcweir {
429cdf0e10cSrcweir pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
430cdf0e10cSrcweir }
431cdf0e10cSrcweir else
432cdf0e10cSrcweir {
433cdf0e10cSrcweir // pStateSetHelper->AddState( AccessibleStateType::ENABLED );
434cdf0e10cSrcweir // pStateSetHelper->AddState( AccessibleStateType::SENSITIVE );
435cdf0e10cSrcweir pStateSetHelper->AddState( AccessibleStateType::FOCUSABLE );
436cdf0e10cSrcweir if( mpControl->HasFocus() )
437cdf0e10cSrcweir pStateSetHelper->AddState( AccessibleStateType::FOCUSED );
438cdf0e10cSrcweir pStateSetHelper->AddState( AccessibleStateType::OPAQUE );
439cdf0e10cSrcweir pStateSetHelper->AddState( AccessibleStateType::SHOWING );
440cdf0e10cSrcweir pStateSetHelper->AddState( AccessibleStateType::VISIBLE );
441cdf0e10cSrcweir }
442cdf0e10cSrcweir
443cdf0e10cSrcweir return pStateSetHelper;
444cdf0e10cSrcweir }
445cdf0e10cSrcweir
446cdf0e10cSrcweir //-----------------------------------------------------------------------------
447cdf0e10cSrcweir
getLocale(void)448cdf0e10cSrcweir lang::Locale SAL_CALL SvxGraphCtrlAccessibleContext::getLocale( void ) throw( IllegalAccessibleComponentStateException, RuntimeException )
449cdf0e10cSrcweir {
450cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
451cdf0e10cSrcweir
452cdf0e10cSrcweir if( mxParent.is() )
453cdf0e10cSrcweir {
454cdf0e10cSrcweir Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() );
455cdf0e10cSrcweir if( xParentContext.is() )
456cdf0e10cSrcweir return xParentContext->getLocale();
457cdf0e10cSrcweir }
458cdf0e10cSrcweir
459cdf0e10cSrcweir // No parent. Therefore throw exception to indicate this cluelessness.
460cdf0e10cSrcweir throw IllegalAccessibleComponentStateException();
461cdf0e10cSrcweir }
462cdf0e10cSrcweir
463cdf0e10cSrcweir //===== XAccessibleEventListener ============================================
464cdf0e10cSrcweir
addEventListener(const Reference<XAccessibleEventListener> & xListener)465cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::addEventListener( const Reference< XAccessibleEventListener >& xListener )
466cdf0e10cSrcweir throw( RuntimeException )
467cdf0e10cSrcweir {
468cdf0e10cSrcweir if (xListener.is())
469cdf0e10cSrcweir {
470cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
471cdf0e10cSrcweir if (!mnClientId)
472cdf0e10cSrcweir mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
473cdf0e10cSrcweir comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
474cdf0e10cSrcweir }
475cdf0e10cSrcweir }
476cdf0e10cSrcweir
477cdf0e10cSrcweir //-----------------------------------------------------------------------------
478cdf0e10cSrcweir
removeEventListener(const Reference<XAccessibleEventListener> & xListener)479cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::removeEventListener( const Reference< XAccessibleEventListener >& xListener )
480cdf0e10cSrcweir throw( RuntimeException )
481cdf0e10cSrcweir {
482cdf0e10cSrcweir if (xListener.is())
483cdf0e10cSrcweir {
484cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
485cdf0e10cSrcweir
486cdf0e10cSrcweir sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
487cdf0e10cSrcweir if ( !nListenerCount )
488cdf0e10cSrcweir {
489cdf0e10cSrcweir // no listeners anymore
490cdf0e10cSrcweir // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
491cdf0e10cSrcweir // and at least to us not firing any events anymore, in case somebody calls
492cdf0e10cSrcweir // NotifyAccessibleEvent, again
493cdf0e10cSrcweir comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
494cdf0e10cSrcweir mnClientId = 0;
495cdf0e10cSrcweir }
496cdf0e10cSrcweir }
497cdf0e10cSrcweir }
498cdf0e10cSrcweir
499cdf0e10cSrcweir //-----------------------------------------------------------------------------
500cdf0e10cSrcweir
addFocusListener(const Reference<awt::XFocusListener> & xListener)501cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::addFocusListener( const Reference< awt::XFocusListener >& xListener )
502cdf0e10cSrcweir throw( RuntimeException )
503cdf0e10cSrcweir {
504cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
505cdf0e10cSrcweir
506cdf0e10cSrcweir if( xListener.is() )
507cdf0e10cSrcweir {
508cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow > xWindow( VCLUnoHelper::GetInterface( mpControl ) );
509cdf0e10cSrcweir if( xWindow.is() )
510cdf0e10cSrcweir xWindow->addFocusListener( xListener );
511cdf0e10cSrcweir }
512cdf0e10cSrcweir }
513cdf0e10cSrcweir
514cdf0e10cSrcweir //-----------------------------------------------------------------------------
515cdf0e10cSrcweir
removeFocusListener(const Reference<awt::XFocusListener> & xListener)516cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::removeFocusListener( const Reference< awt::XFocusListener >& xListener )
517cdf0e10cSrcweir throw (RuntimeException)
518cdf0e10cSrcweir {
519cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
520cdf0e10cSrcweir
521cdf0e10cSrcweir if( xListener.is() )
522cdf0e10cSrcweir {
523cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow > xWindow = VCLUnoHelper::GetInterface( mpControl );
524cdf0e10cSrcweir if( xWindow.is() )
525cdf0e10cSrcweir xWindow->removeFocusListener( xListener );
526cdf0e10cSrcweir }
527cdf0e10cSrcweir }
528cdf0e10cSrcweir
529cdf0e10cSrcweir //-----------------------------------------------------------------------------
530cdf0e10cSrcweir
grabFocus()531cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::grabFocus() throw( RuntimeException )
532cdf0e10cSrcweir {
533cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
534cdf0e10cSrcweir
535cdf0e10cSrcweir if( NULL == mpControl )
536cdf0e10cSrcweir throw DisposedException();
537cdf0e10cSrcweir
538cdf0e10cSrcweir mpControl->GrabFocus();
539cdf0e10cSrcweir }
540cdf0e10cSrcweir
541cdf0e10cSrcweir //-----------------------------------------------------------------------------
542cdf0e10cSrcweir
getAccessibleKeyBinding()543cdf0e10cSrcweir Any SAL_CALL SvxGraphCtrlAccessibleContext::getAccessibleKeyBinding() throw( RuntimeException )
544cdf0e10cSrcweir {
545cdf0e10cSrcweir // here is no implementation, because here are no KeyBindings for every object
546cdf0e10cSrcweir return Any();
547cdf0e10cSrcweir }
548cdf0e10cSrcweir
549cdf0e10cSrcweir
550cdf0e10cSrcweir
551cdf0e10cSrcweir
552cdf0e10cSrcweir
getForeground(void)553cdf0e10cSrcweir sal_Int32 SAL_CALL SvxGraphCtrlAccessibleContext::getForeground (void)
554cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
555cdf0e10cSrcweir {
556cdf0e10cSrcweir svtools::ColorConfig aColorConfig;
557cdf0e10cSrcweir sal_uInt32 nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor;
558cdf0e10cSrcweir return static_cast<sal_Int32>(nColor);
559cdf0e10cSrcweir }
560cdf0e10cSrcweir
561cdf0e10cSrcweir
562cdf0e10cSrcweir
563cdf0e10cSrcweir
getBackground(void)564cdf0e10cSrcweir sal_Int32 SAL_CALL SvxGraphCtrlAccessibleContext::getBackground (void)
565cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
566cdf0e10cSrcweir {
567cdf0e10cSrcweir sal_uInt32 nColor = Application::GetSettings().GetStyleSettings().GetWindowColor().GetColor();
568cdf0e10cSrcweir return static_cast<sal_Int32>(nColor);
569cdf0e10cSrcweir }
570cdf0e10cSrcweir
571cdf0e10cSrcweir
572cdf0e10cSrcweir //===== XServiceInfo ========================================================
573cdf0e10cSrcweir
getImplementationName(void)574cdf0e10cSrcweir OUString SAL_CALL SvxGraphCtrlAccessibleContext::getImplementationName( void ) throw( RuntimeException )
575cdf0e10cSrcweir {
576cdf0e10cSrcweir return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.ui.SvxGraphCtrlAccessibleContext" ) );
577cdf0e10cSrcweir }
578cdf0e10cSrcweir
579cdf0e10cSrcweir //-----------------------------------------------------------------------------
580cdf0e10cSrcweir
supportsService(const OUString & sServiceName)581cdf0e10cSrcweir sal_Bool SAL_CALL SvxGraphCtrlAccessibleContext::supportsService( const OUString& sServiceName ) throw( RuntimeException )
582cdf0e10cSrcweir {
583cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
584cdf0e10cSrcweir // Iterate over all supported service names and return true if on of them
585cdf0e10cSrcweir // matches the given name.
586cdf0e10cSrcweir Sequence< OUString > aSupportedServices( getSupportedServiceNames() );
587cdf0e10cSrcweir int nLenght = aSupportedServices.getLength();
588cdf0e10cSrcweir
589cdf0e10cSrcweir for( int i = 0 ; i < nLenght ; ++i )
590cdf0e10cSrcweir {
591cdf0e10cSrcweir if( sServiceName == aSupportedServices[ i ] )
592cdf0e10cSrcweir return sal_True;
593cdf0e10cSrcweir }
594cdf0e10cSrcweir
595cdf0e10cSrcweir return sal_False;
596cdf0e10cSrcweir }
597cdf0e10cSrcweir
598cdf0e10cSrcweir //-----------------------------------------------------------------------------
599cdf0e10cSrcweir
getSupportedServiceNames(void)600cdf0e10cSrcweir Sequence< OUString > SAL_CALL SvxGraphCtrlAccessibleContext::getSupportedServiceNames( void ) throw( RuntimeException )
601cdf0e10cSrcweir {
602cdf0e10cSrcweir Sequence< OUString > aSNs( 3 );
603cdf0e10cSrcweir
604cdf0e10cSrcweir aSNs[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.Accessible" ) );
605cdf0e10cSrcweir aSNs[1] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.AccessibleContext" ) );
606cdf0e10cSrcweir aSNs[2] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.AccessibleGraphControl" ) );
607cdf0e10cSrcweir
608cdf0e10cSrcweir return aSNs;
609cdf0e10cSrcweir }
610cdf0e10cSrcweir
611cdf0e10cSrcweir //===== XTypeProvider =======================================================
612cdf0e10cSrcweir
getImplementationId(void)613cdf0e10cSrcweir Sequence<sal_Int8> SAL_CALL SvxGraphCtrlAccessibleContext::getImplementationId( void ) throw( RuntimeException )
614cdf0e10cSrcweir {
615cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
616cdf0e10cSrcweir return getUniqueId();
617cdf0e10cSrcweir }
618cdf0e10cSrcweir
619cdf0e10cSrcweir //===== XServiceName ========================================================
620cdf0e10cSrcweir
getServiceName(void)621cdf0e10cSrcweir OUString SvxGraphCtrlAccessibleContext::getServiceName( void ) throw( RuntimeException )
622cdf0e10cSrcweir {
623cdf0e10cSrcweir return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.AccessibleContext" ) );
624cdf0e10cSrcweir }
625cdf0e10cSrcweir
626cdf0e10cSrcweir //===== XAccessibleSelection =============================================
627cdf0e10cSrcweir
selectAccessibleChild(sal_Int32 nIndex)628cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::selectAccessibleChild( sal_Int32 nIndex ) throw( lang::IndexOutOfBoundsException, RuntimeException )
629cdf0e10cSrcweir {
630cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
631cdf0e10cSrcweir
632cdf0e10cSrcweir if( NULL == mpView )
633cdf0e10cSrcweir throw DisposedException();
634cdf0e10cSrcweir
635cdf0e10cSrcweir SdrObject* pObj = getSdrObject( nIndex );
636cdf0e10cSrcweir
637cdf0e10cSrcweir if( pObj )
638cdf0e10cSrcweir mpView->MarkObj( pObj, mpView->GetSdrPageView());
639cdf0e10cSrcweir }
640cdf0e10cSrcweir
641cdf0e10cSrcweir //-----------------------------------------------------------------------------
642cdf0e10cSrcweir
isAccessibleChildSelected(sal_Int32 nIndex)643cdf0e10cSrcweir sal_Bool SAL_CALL SvxGraphCtrlAccessibleContext::isAccessibleChildSelected( sal_Int32 nIndex ) throw( lang::IndexOutOfBoundsException, RuntimeException )
644cdf0e10cSrcweir {
645cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
646cdf0e10cSrcweir
647cdf0e10cSrcweir if( NULL == mpView )
648cdf0e10cSrcweir throw DisposedException();
649cdf0e10cSrcweir
650cdf0e10cSrcweir return mpView->IsObjMarked( getSdrObject( nIndex ) );
651cdf0e10cSrcweir }
652cdf0e10cSrcweir
653cdf0e10cSrcweir //-----------------------------------------------------------------------------
654cdf0e10cSrcweir
clearAccessibleSelection()655cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::clearAccessibleSelection() throw( RuntimeException )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
658cdf0e10cSrcweir
659cdf0e10cSrcweir if( NULL == mpView )
660cdf0e10cSrcweir throw DisposedException();
661cdf0e10cSrcweir
662cdf0e10cSrcweir mpView->UnmarkAllObj();
663cdf0e10cSrcweir }
664cdf0e10cSrcweir
665cdf0e10cSrcweir //-----------------------------------------------------------------------------
666cdf0e10cSrcweir
selectAllAccessibleChildren()667cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::selectAllAccessibleChildren() throw( RuntimeException )
668cdf0e10cSrcweir {
669cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
670cdf0e10cSrcweir
671cdf0e10cSrcweir if( NULL == mpView )
672cdf0e10cSrcweir throw DisposedException();
673cdf0e10cSrcweir
674cdf0e10cSrcweir mpView->MarkAllObj();
675cdf0e10cSrcweir }
676cdf0e10cSrcweir
677cdf0e10cSrcweir //-----------------------------------------------------------------------------
678cdf0e10cSrcweir
getSelectedAccessibleChildCount()679cdf0e10cSrcweir sal_Int32 SAL_CALL SvxGraphCtrlAccessibleContext::getSelectedAccessibleChildCount() throw( RuntimeException )
680cdf0e10cSrcweir {
681cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
682cdf0e10cSrcweir
683cdf0e10cSrcweir if( NULL == mpView )
684cdf0e10cSrcweir throw DisposedException();
685cdf0e10cSrcweir
686cdf0e10cSrcweir const SdrMarkList& rList = mpView->GetMarkedObjectList();
687cdf0e10cSrcweir return rList.GetMarkCount();
688cdf0e10cSrcweir }
689cdf0e10cSrcweir
690cdf0e10cSrcweir //-----------------------------------------------------------------------------
691cdf0e10cSrcweir
getSelectedAccessibleChild(sal_Int32 nIndex)692cdf0e10cSrcweir Reference< XAccessible > SAL_CALL SvxGraphCtrlAccessibleContext::getSelectedAccessibleChild( sal_Int32 nIndex )
693cdf0e10cSrcweir throw( lang::IndexOutOfBoundsException, RuntimeException )
694cdf0e10cSrcweir {
695cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
696cdf0e10cSrcweir
697cdf0e10cSrcweir checkChildIndexOnSelection( nIndex );
698cdf0e10cSrcweir
699cdf0e10cSrcweir Reference< XAccessible > xAccessible;
700cdf0e10cSrcweir
701cdf0e10cSrcweir const SdrMarkList& rList = mpView->GetMarkedObjectList();
702cdf0e10cSrcweir SdrObject* pObj = rList.GetMark(nIndex)->GetMarkedSdrObj();
703cdf0e10cSrcweir if( pObj )
704cdf0e10cSrcweir xAccessible = getAccessible( pObj );
705cdf0e10cSrcweir
706cdf0e10cSrcweir return xAccessible;
707cdf0e10cSrcweir }
708cdf0e10cSrcweir
709cdf0e10cSrcweir //-----------------------------------------------------------------------------
710cdf0e10cSrcweir
deselectAccessibleChild(sal_Int32 nIndex)711cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::deselectAccessibleChild( sal_Int32 nIndex ) throw( lang::IndexOutOfBoundsException, RuntimeException )
712cdf0e10cSrcweir {
713cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
714cdf0e10cSrcweir
715cdf0e10cSrcweir checkChildIndexOnSelection( nIndex );
716cdf0e10cSrcweir
717cdf0e10cSrcweir if( mpView )
718cdf0e10cSrcweir {
719cdf0e10cSrcweir const SdrMarkList& rList = mpView->GetMarkedObjectList();
720cdf0e10cSrcweir
721cdf0e10cSrcweir SdrObject* pObj = getSdrObject( nIndex );
722cdf0e10cSrcweir if( pObj )
723cdf0e10cSrcweir {
724cdf0e10cSrcweir SdrMarkList aRefList( rList );
725cdf0e10cSrcweir
726cdf0e10cSrcweir SdrPageView* pPV = mpView->GetSdrPageView();
727cdf0e10cSrcweir mpView->UnmarkAllObj( pPV );
728cdf0e10cSrcweir
729cdf0e10cSrcweir sal_uInt32 nCount = aRefList.GetMarkCount();
730cdf0e10cSrcweir sal_uInt32 nMark;
731cdf0e10cSrcweir for( nMark = 0; nMark < nCount; nMark++ )
732cdf0e10cSrcweir {
733cdf0e10cSrcweir if( aRefList.GetMark(nMark)->GetMarkedSdrObj() != pObj )
734cdf0e10cSrcweir mpView->MarkObj( aRefList.GetMark(nMark)->GetMarkedSdrObj(), pPV );
735cdf0e10cSrcweir }
736cdf0e10cSrcweir }
737cdf0e10cSrcweir }
738cdf0e10cSrcweir }
739cdf0e10cSrcweir
740cdf0e10cSrcweir //===== internals ========================================================
741cdf0e10cSrcweir
checkChildIndex(long nIndex)742cdf0e10cSrcweir void SvxGraphCtrlAccessibleContext::checkChildIndex( long nIndex ) throw( lang::IndexOutOfBoundsException )
743cdf0e10cSrcweir {
744cdf0e10cSrcweir if( nIndex < 0 || nIndex >= getAccessibleChildCount() )
745cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
746cdf0e10cSrcweir }
747cdf0e10cSrcweir
748cdf0e10cSrcweir //-----------------------------------------------------------------------------
749cdf0e10cSrcweir
checkChildIndexOnSelection(long nIndex)750cdf0e10cSrcweir void SvxGraphCtrlAccessibleContext::checkChildIndexOnSelection( long nIndex ) throw( lang::IndexOutOfBoundsException )
751cdf0e10cSrcweir {
752cdf0e10cSrcweir if( nIndex < 0 || nIndex >= getSelectedAccessibleChildCount() )
753cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
754cdf0e10cSrcweir }
755cdf0e10cSrcweir
756cdf0e10cSrcweir //-----------------------------------------------------------------------------
757cdf0e10cSrcweir
setName(const OUString & rName)758cdf0e10cSrcweir void SvxGraphCtrlAccessibleContext::setName( const OUString& rName )
759cdf0e10cSrcweir {
760cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
761cdf0e10cSrcweir
762cdf0e10cSrcweir msName = rName;
763cdf0e10cSrcweir }
764cdf0e10cSrcweir
765cdf0e10cSrcweir //-----------------------------------------------------------------------------
766cdf0e10cSrcweir
setDescription(const OUString & rDescr)767cdf0e10cSrcweir void SvxGraphCtrlAccessibleContext::setDescription( const OUString& rDescr )
768cdf0e10cSrcweir {
769cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
770cdf0e10cSrcweir
771cdf0e10cSrcweir msDescription = rDescr;
772cdf0e10cSrcweir }
773cdf0e10cSrcweir
774cdf0e10cSrcweir
775cdf0e10cSrcweir
776cdf0e10cSrcweir
777cdf0e10cSrcweir /** Replace the model, page, and view pointers by the ones provided
778cdf0e10cSrcweir (explicitly and implicitly).
779cdf0e10cSrcweir */
setModelAndView(SdrModel * pModel,SdrView * pView)780cdf0e10cSrcweir void SvxGraphCtrlAccessibleContext::setModelAndView (
781cdf0e10cSrcweir SdrModel* pModel,
782cdf0e10cSrcweir SdrView* pView)
783cdf0e10cSrcweir {
784cdf0e10cSrcweir OGuard aGuard (Application::GetSolarMutex());
785cdf0e10cSrcweir
786cdf0e10cSrcweir mpModel = pModel;
787cdf0e10cSrcweir if (mpModel != NULL)
788cdf0e10cSrcweir mpPage = (SdrPage*)mpModel->GetPage( 0 );
789cdf0e10cSrcweir mpView = pView;
790cdf0e10cSrcweir
791cdf0e10cSrcweir if (mpModel == NULL || mpPage == NULL || mpView == NULL)
792cdf0e10cSrcweir {
793cdf0e10cSrcweir mbDisposed = true;
794cdf0e10cSrcweir
795cdf0e10cSrcweir // Set all the pointers to NULL just in case they are used as
796cdf0e10cSrcweir // a disposed flag.
797cdf0e10cSrcweir mpModel = NULL;
798cdf0e10cSrcweir mpPage = NULL;
799cdf0e10cSrcweir mpView = NULL;
800cdf0e10cSrcweir }
801cdf0e10cSrcweir
802cdf0e10cSrcweir maTreeInfo.SetSdrView (mpView);
803cdf0e10cSrcweir }
804cdf0e10cSrcweir
805cdf0e10cSrcweir
806cdf0e10cSrcweir
807cdf0e10cSrcweir //-----------------------------------------------------------------------------
808cdf0e10cSrcweir
disposing()809cdf0e10cSrcweir void SAL_CALL SvxGraphCtrlAccessibleContext::disposing()
810cdf0e10cSrcweir {
811cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
812cdf0e10cSrcweir
813cdf0e10cSrcweir if( mbDisposed )
814cdf0e10cSrcweir return;
815cdf0e10cSrcweir
816cdf0e10cSrcweir mbDisposed = sal_True;
817cdf0e10cSrcweir
818cdf0e10cSrcweir mpControl = NULL; // object dies with representation
819cdf0e10cSrcweir mpView = NULL;
820cdf0e10cSrcweir mpPage = NULL;
821cdf0e10cSrcweir
822cdf0e10cSrcweir {
823cdf0e10cSrcweir ShapesMapType::iterator I;
824cdf0e10cSrcweir
825cdf0e10cSrcweir for (I=mxShapes.begin(); I!=mxShapes.end(); I++)
826cdf0e10cSrcweir {
827cdf0e10cSrcweir XAccessible* pAcc = (*I).second;
828cdf0e10cSrcweir Reference< XComponent > xComp( pAcc, UNO_QUERY );
829cdf0e10cSrcweir if( xComp.is() )
830cdf0e10cSrcweir xComp->dispose();
831cdf0e10cSrcweir
832cdf0e10cSrcweir (*I).second->release();
833cdf0e10cSrcweir }
834cdf0e10cSrcweir
835cdf0e10cSrcweir mxShapes.clear();
836cdf0e10cSrcweir }
837cdf0e10cSrcweir
838cdf0e10cSrcweir // Send a disposing to all listeners.
839cdf0e10cSrcweir if ( mnClientId )
840cdf0e10cSrcweir {
841cdf0e10cSrcweir comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
842cdf0e10cSrcweir mnClientId = 0;
843cdf0e10cSrcweir }
844cdf0e10cSrcweir }
845cdf0e10cSrcweir
846cdf0e10cSrcweir //-----------------------------------------------------------------------------
847cdf0e10cSrcweir
GetBoundingBoxOnScreen(void)848cdf0e10cSrcweir Rectangle SvxGraphCtrlAccessibleContext::GetBoundingBoxOnScreen( void ) throw( RuntimeException )
849cdf0e10cSrcweir {
850cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
851cdf0e10cSrcweir
852cdf0e10cSrcweir if( NULL == mpControl )
853cdf0e10cSrcweir throw DisposedException();
854cdf0e10cSrcweir
855cdf0e10cSrcweir return Rectangle(
856cdf0e10cSrcweir mpControl->GetAccessibleParentWindow()->OutputToAbsoluteScreenPixel(
857cdf0e10cSrcweir mpControl->GetPosPixel() ),
858cdf0e10cSrcweir mpControl->GetSizePixel() );
859cdf0e10cSrcweir }
860cdf0e10cSrcweir
861cdf0e10cSrcweir //-----------------------------------------------------------------------------
862cdf0e10cSrcweir
863cdf0e10cSrcweir /** Calculate the relative coordinates of the bounding box as difference
864cdf0e10cSrcweir between the absolute coordinates of the bounding boxes of this control
865cdf0e10cSrcweir and its parent in the accessibility tree.
866cdf0e10cSrcweir */
GetBoundingBox(void)867cdf0e10cSrcweir Rectangle SvxGraphCtrlAccessibleContext::GetBoundingBox( void ) throw( RuntimeException )
868cdf0e10cSrcweir {
869cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
870cdf0e10cSrcweir
871cdf0e10cSrcweir Rectangle aBounds ( 0, 0, 0, 0 );
872cdf0e10cSrcweir
873cdf0e10cSrcweir Window* pWindow = mpControl;
874cdf0e10cSrcweir if (pWindow != NULL)
875cdf0e10cSrcweir {
876cdf0e10cSrcweir aBounds = pWindow->GetWindowExtentsRelative (NULL);
877cdf0e10cSrcweir Window* pParent = pWindow->GetAccessibleParentWindow();
878cdf0e10cSrcweir if (pParent != NULL)
879cdf0e10cSrcweir {
880cdf0e10cSrcweir Rectangle aParentRect = pParent->GetWindowExtentsRelative (NULL);
881cdf0e10cSrcweir aBounds -= aParentRect.TopLeft();
882cdf0e10cSrcweir }
883cdf0e10cSrcweir }
884cdf0e10cSrcweir else
885cdf0e10cSrcweir throw DisposedException();
886cdf0e10cSrcweir
887cdf0e10cSrcweir return aBounds;
888cdf0e10cSrcweir }
889cdf0e10cSrcweir
890cdf0e10cSrcweir //-----------------------------------------------------------------------------
891cdf0e10cSrcweir
getUniqueId(void)892cdf0e10cSrcweir Sequence< sal_Int8 > SvxGraphCtrlAccessibleContext::getUniqueId( void )
893cdf0e10cSrcweir {
894cdf0e10cSrcweir // no guard because it's private -> has to guarded when using it!
895cdf0e10cSrcweir static OImplementationId* pId = 0;
896cdf0e10cSrcweir if( !pId )
897cdf0e10cSrcweir {
898cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
899cdf0e10cSrcweir if( !pId)
900cdf0e10cSrcweir {
901cdf0e10cSrcweir static OImplementationId aId;
902cdf0e10cSrcweir pId = &aId;
903cdf0e10cSrcweir }
904cdf0e10cSrcweir }
905cdf0e10cSrcweir return pId->getImplementationId();
906cdf0e10cSrcweir }
907cdf0e10cSrcweir
908cdf0e10cSrcweir //-----------------------------------------------------------------------------
909cdf0e10cSrcweir
Notify(SfxBroadcaster &,const SfxHint & rHint)910cdf0e10cSrcweir void SvxGraphCtrlAccessibleContext::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
911cdf0e10cSrcweir {
912cdf0e10cSrcweir const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint );
913cdf0e10cSrcweir
914cdf0e10cSrcweir if( pSdrHint )
915cdf0e10cSrcweir {
916cdf0e10cSrcweir switch( pSdrHint->GetKind() )
917cdf0e10cSrcweir {
918cdf0e10cSrcweir case HINT_OBJCHG:
919cdf0e10cSrcweir {
920cdf0e10cSrcweir ShapesMapType::iterator iter = mxShapes.find( pSdrHint->GetObject() );
921cdf0e10cSrcweir
922cdf0e10cSrcweir if( iter != mxShapes.end() )
923cdf0e10cSrcweir {
924cdf0e10cSrcweir // if we already have one, return it
925cdf0e10cSrcweir AccessibleShape* pShape = (*iter).second;
926cdf0e10cSrcweir
927cdf0e10cSrcweir if( NULL != pShape )
928cdf0e10cSrcweir pShape->CommitChange( AccessibleEventId::VISIBLE_DATA_CHANGED, uno::Any(), uno::Any() );
929cdf0e10cSrcweir }
930cdf0e10cSrcweir }
931cdf0e10cSrcweir break;
932cdf0e10cSrcweir
933cdf0e10cSrcweir case HINT_OBJINSERTED:
934cdf0e10cSrcweir CommitChange( AccessibleEventId::CHILD, makeAny( getAccessible( pSdrHint->GetObject() ) ) , uno::Any());
935cdf0e10cSrcweir break;
936cdf0e10cSrcweir case HINT_OBJREMOVED:
937cdf0e10cSrcweir CommitChange( AccessibleEventId::CHILD, uno::Any(), makeAny( getAccessible( pSdrHint->GetObject() ) ) );
938cdf0e10cSrcweir break;
939cdf0e10cSrcweir case HINT_MODELCLEARED:
940cdf0e10cSrcweir dispose();
941cdf0e10cSrcweir break;
942cdf0e10cSrcweir default:
943cdf0e10cSrcweir break;
944cdf0e10cSrcweir }
945cdf0e10cSrcweir }
946cdf0e10cSrcweir else
947cdf0e10cSrcweir {
948cdf0e10cSrcweir const SfxSimpleHint* pSfxHint = PTR_CAST(SfxSimpleHint, &rHint );
949cdf0e10cSrcweir
950cdf0e10cSrcweir // ist unser SdDrawDocument gerade gestorben?
951cdf0e10cSrcweir if(pSfxHint && pSfxHint->GetId() == SFX_HINT_DYING)
952cdf0e10cSrcweir {
953cdf0e10cSrcweir dispose();
954cdf0e10cSrcweir }
955cdf0e10cSrcweir }
956cdf0e10cSrcweir }
957cdf0e10cSrcweir
958cdf0e10cSrcweir //===== IAccessibleViewforwarder ========================================
959cdf0e10cSrcweir
IsValid(void) const960cdf0e10cSrcweir sal_Bool SvxGraphCtrlAccessibleContext::IsValid (void) const
961cdf0e10cSrcweir {
962cdf0e10cSrcweir return sal_True;
963cdf0e10cSrcweir }
964cdf0e10cSrcweir
965cdf0e10cSrcweir //-----------------------------------------------------------------------------
966cdf0e10cSrcweir
GetVisibleArea(void) const967cdf0e10cSrcweir Rectangle SvxGraphCtrlAccessibleContext::GetVisibleArea (void) const
968cdf0e10cSrcweir {
969cdf0e10cSrcweir Rectangle aVisArea;
970cdf0e10cSrcweir
971cdf0e10cSrcweir if( mpView && mpView->PaintWindowCount())
972cdf0e10cSrcweir {
973cdf0e10cSrcweir SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(0L);
974cdf0e10cSrcweir aVisArea = pPaintWindow->GetVisibleArea();
975cdf0e10cSrcweir }
976cdf0e10cSrcweir
977cdf0e10cSrcweir return aVisArea;
978cdf0e10cSrcweir }
979cdf0e10cSrcweir
980cdf0e10cSrcweir //-----------------------------------------------------------------------------
981cdf0e10cSrcweir
LogicToPixel(const Point & rPoint) const982cdf0e10cSrcweir Point SvxGraphCtrlAccessibleContext::LogicToPixel (const Point& rPoint) const
983cdf0e10cSrcweir {
984cdf0e10cSrcweir if( mpControl )
985cdf0e10cSrcweir {
986cdf0e10cSrcweir Rectangle aBBox(mpControl->GetWindowExtentsRelative(NULL));
987cdf0e10cSrcweir return mpControl->LogicToPixel (rPoint) + aBBox.TopLeft();
988cdf0e10cSrcweir }
989cdf0e10cSrcweir else
990cdf0e10cSrcweir {
991cdf0e10cSrcweir return rPoint;
992cdf0e10cSrcweir }
993cdf0e10cSrcweir }
994cdf0e10cSrcweir
995cdf0e10cSrcweir //-----------------------------------------------------------------------------
996cdf0e10cSrcweir
LogicToPixel(const Size & rSize) const997cdf0e10cSrcweir Size SvxGraphCtrlAccessibleContext::LogicToPixel (const Size& rSize) const
998cdf0e10cSrcweir {
999cdf0e10cSrcweir if( mpControl )
1000cdf0e10cSrcweir return mpControl->LogicToPixel (rSize);
1001cdf0e10cSrcweir else
1002cdf0e10cSrcweir return rSize;
1003cdf0e10cSrcweir }
1004cdf0e10cSrcweir
1005cdf0e10cSrcweir //-----------------------------------------------------------------------------
1006cdf0e10cSrcweir
PixelToLogic(const Point & rPoint) const1007cdf0e10cSrcweir Point SvxGraphCtrlAccessibleContext::PixelToLogic (const Point& rPoint) const
1008cdf0e10cSrcweir {
1009cdf0e10cSrcweir if( mpControl )
1010cdf0e10cSrcweir return mpControl->PixelToLogic (rPoint);
1011cdf0e10cSrcweir else
1012cdf0e10cSrcweir return rPoint;
1013cdf0e10cSrcweir }
1014cdf0e10cSrcweir
1015cdf0e10cSrcweir //-----------------------------------------------------------------------------
1016cdf0e10cSrcweir
PixelToLogic(const Size & rSize) const1017cdf0e10cSrcweir Size SvxGraphCtrlAccessibleContext::PixelToLogic (const Size& rSize) const
1018cdf0e10cSrcweir {
1019cdf0e10cSrcweir if( mpControl )
1020cdf0e10cSrcweir return mpControl->PixelToLogic (rSize);
1021cdf0e10cSrcweir else
1022cdf0e10cSrcweir return rSize;
1023cdf0e10cSrcweir }
1024