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