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_sc.hxx"
26*b1cdbd2cSJim Jagielski #include "AccessibleDataPilotControl.hxx"
27*b1cdbd2cSJim Jagielski #include "unoguard.hxx"
28*b1cdbd2cSJim Jagielski #include "fieldwnd.hxx"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleRole.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleStateType.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleEventId.hpp>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/XAccessibleAction.hpp>
35*b1cdbd2cSJim Jagielski #include <comphelper/accessiblekeybindinghelper.hxx>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/KeyModifier.hpp>
37*b1cdbd2cSJim Jagielski #include <vcl/keycodes.hxx>
38*b1cdbd2cSJim Jagielski #ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX
39*b1cdbd2cSJim Jagielski #include <unotools/accessiblestatesethelper.hxx>
40*b1cdbd2cSJim Jagielski #endif
41*b1cdbd2cSJim Jagielski #include <rtl/uuid.h>
42*b1cdbd2cSJim Jagielski #include <tools/gen.hxx>
43*b1cdbd2cSJim Jagielski #include <toolkit/helper/convert.hxx>
44*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleRelationType.hpp>
47*b1cdbd2cSJim Jagielski #include <unotools/accessiblerelationsethelper.hxx>
48*b1cdbd2cSJim Jagielski using namespace	::com::sun::star;
49*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::accessibility;
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski class ScAccessibleDataPilotButton
52*b1cdbd2cSJim Jagielski 	:	public ScAccessibleContextBase
53*b1cdbd2cSJim Jagielski 	, public ::com::sun::star::accessibility::XAccessibleAction
54*b1cdbd2cSJim Jagielski {
55*b1cdbd2cSJim Jagielski public:
56*b1cdbd2cSJim Jagielski 	//=====  internal  ========================================================
57*b1cdbd2cSJim Jagielski 	ScAccessibleDataPilotButton(
58*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
59*b1cdbd2cSJim Jagielski         ::com::sun::star::accessibility::XAccessible>& rxParent,
60*b1cdbd2cSJim Jagielski         ScPivotFieldWindow* pFieldWindow,
61*b1cdbd2cSJim Jagielski         sal_Int32 nIndex);
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 	virtual void Init();
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski     using ScAccessibleContextBase::disposing;
66*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing();
67*b1cdbd2cSJim Jagielski 
SetIndex(sal_Int32 nIndex)68*b1cdbd2cSJim Jagielski     void SetIndex(sal_Int32 nIndex) { mnIndex = nIndex; }
69*b1cdbd2cSJim Jagielski     void NameChanged();
70*b1cdbd2cSJim Jagielski     void SetFocused();
71*b1cdbd2cSJim Jagielski     void ResetFocused();
72*b1cdbd2cSJim Jagielski protected:
73*b1cdbd2cSJim Jagielski 	virtual ~ScAccessibleDataPilotButton(void);
74*b1cdbd2cSJim Jagielski public:
75*b1cdbd2cSJim Jagielski 	// XAccessibleAction
76*b1cdbd2cSJim Jagielski 	virtual sal_Int32 SAL_CALL getAccessibleActionCount( ) throw (::com::sun::star::uno::RuntimeException);
77*b1cdbd2cSJim Jagielski 	virtual sal_Bool SAL_CALL doAccessibleAction ( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
78*b1cdbd2cSJim Jagielski 	virtual ::rtl::OUString SAL_CALL getAccessibleActionDescription ( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
79*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleKeyBinding > SAL_CALL getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
80*b1cdbd2cSJim Jagielski 	///=====  XInterface  =====================================================
81*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
82*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Type const & rType )
83*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
84*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL acquire() throw ();
85*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL release() throw ();
86*b1cdbd2cSJim Jagielski 	///=====  XAccessibleComponent  ============================================
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
89*b1cdbd2cSJim Jagielski 		SAL_CALL getAccessibleAtPoint(
90*b1cdbd2cSJim Jagielski 		const ::com::sun::star::awt::Point& rPoint )
91*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL isVisible(  )
94*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski     virtual void SAL_CALL grabFocus(  )
97*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL getForeground(  )
100*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL getBackground(  )
103*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski     ///=====  XAccessibleContext  ==============================================
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski     ///	Return the number of currently visible children.
108*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL
109*b1cdbd2cSJim Jagielski     	getAccessibleChildCount(void) throw (::com::sun::star::uno::RuntimeException);
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski     ///	Return the specified child or NULL if index is invalid.
112*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL
113*b1cdbd2cSJim Jagielski     	getAccessibleChild(sal_Int32 nIndex)
114*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException,
115*b1cdbd2cSJim Jagielski 				::com::sun::star::lang::IndexOutOfBoundsException);
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski     ///	Return this objects index among the parents children.
118*b1cdbd2cSJim Jagielski 	virtual	sal_Int32 SAL_CALL
119*b1cdbd2cSJim Jagielski     	getAccessibleIndexInParent(void)
120*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski     ///	Return the set of current states.
123*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Reference<
124*b1cdbd2cSJim Jagielski             ::com::sun::star::accessibility::XAccessibleStateSet> SAL_CALL
125*b1cdbd2cSJim Jagielski     	getAccessibleStateSet(void)
126*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
127*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet >
128*b1cdbd2cSJim Jagielski 		SAL_CALL getAccessibleRelationSet(	) throw (::com::sun::star::uno::RuntimeException);
129*b1cdbd2cSJim Jagielski 	///=====  XServiceInfo  ====================================================
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski     /**	Returns an identifier for the implementation of this object.
132*b1cdbd2cSJim Jagielski     */
133*b1cdbd2cSJim Jagielski 	virtual ::rtl::OUString SAL_CALL
134*b1cdbd2cSJim Jagielski     	getImplementationName(void)
135*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 	///=====  XTypeProvider  ===================================================
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	/**	Returns a implementation id.
140*b1cdbd2cSJim Jagielski     */
141*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL
142*b1cdbd2cSJim Jagielski         getImplementationId(void)
143*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski protected:
146*b1cdbd2cSJim Jagielski     ///	Return this object's description.
147*b1cdbd2cSJim Jagielski 	virtual ::rtl::OUString SAL_CALL
148*b1cdbd2cSJim Jagielski     	createAccessibleDescription(void)
149*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski     ///	Return the object's current name.
152*b1cdbd2cSJim Jagielski 	virtual ::rtl::OUString SAL_CALL
153*b1cdbd2cSJim Jagielski     	createAccessibleName(void)
154*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException);
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     ///	Return the object's current bounding box relative to the desktop.
157*b1cdbd2cSJim Jagielski 	virtual Rectangle GetBoundingBoxOnScreen(void) const
158*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 	///	Return the object's current bounding box relative to the parent object.
161*b1cdbd2cSJim Jagielski 	virtual Rectangle GetBoundingBox(void) const
162*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException);
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski private:
165*b1cdbd2cSJim Jagielski     ScPivotFieldWindow* mpFieldWindow;
166*b1cdbd2cSJim Jagielski     sal_Int32        mnIndex;
167*b1cdbd2cSJim Jagielski };
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 	//=====  internal  ========================================================
ScAccessibleDataPilotControl(const uno::Reference<XAccessible> & rxParent,ScPivotFieldWindow * pFieldWindow)170*b1cdbd2cSJim Jagielski ScAccessibleDataPilotControl::ScAccessibleDataPilotControl(
171*b1cdbd2cSJim Jagielski         const uno::Reference<XAccessible>& rxParent,
172*b1cdbd2cSJim Jagielski         ScPivotFieldWindow* pFieldWindow)
173*b1cdbd2cSJim Jagielski         :
174*b1cdbd2cSJim Jagielski     ScAccessibleContextBase(rxParent, AccessibleRole::GROUP_BOX),
175*b1cdbd2cSJim Jagielski     mpFieldWindow(pFieldWindow)
176*b1cdbd2cSJim Jagielski {
177*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
178*b1cdbd2cSJim Jagielski         maChildren.resize(mpFieldWindow->GetFieldCount());
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski 
~ScAccessibleDataPilotControl(void)181*b1cdbd2cSJim Jagielski ScAccessibleDataPilotControl::~ScAccessibleDataPilotControl(void)
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski 	if (!IsDefunc() && !rBHelper.bInDispose)
184*b1cdbd2cSJim Jagielski 	{
185*b1cdbd2cSJim Jagielski 		// increment refcount to prevent double call off dtor
186*b1cdbd2cSJim Jagielski 		osl_incrementInterlockedCount( &m_refCount );
187*b1cdbd2cSJim Jagielski 		// call dispose to inform object wich have a weak reference to this object
188*b1cdbd2cSJim Jagielski 		dispose();
189*b1cdbd2cSJim Jagielski 	}
190*b1cdbd2cSJim Jagielski }
191*b1cdbd2cSJim Jagielski 
Init()192*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotControl::Init()
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
disposing()196*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessibleDataPilotControl::disposing()
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
199*b1cdbd2cSJim Jagielski     mpFieldWindow = NULL;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski     ScAccessibleContextBase::disposing();
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski 
AddField(sal_Int32 nNewIndex)204*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotControl::AddField(sal_Int32 nNewIndex)
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski     sal_Bool bAdded(sal_False);
207*b1cdbd2cSJim Jagielski     if (static_cast<size_t>(nNewIndex) == maChildren.size())
208*b1cdbd2cSJim Jagielski     {
209*b1cdbd2cSJim Jagielski         maChildren.push_back(AccessibleWeak());
210*b1cdbd2cSJim Jagielski         bAdded = sal_True;
211*b1cdbd2cSJim Jagielski     }
212*b1cdbd2cSJim Jagielski     else if (static_cast<size_t>(nNewIndex) < maChildren.size())
213*b1cdbd2cSJim Jagielski     {
214*b1cdbd2cSJim Jagielski         ::std::vector < AccessibleWeak >::iterator aItr = maChildren.begin() + nNewIndex;
215*b1cdbd2cSJim Jagielski         maChildren.insert(aItr, AccessibleWeak());
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski         ::std::vector < AccessibleWeak >::iterator aEndItr = maChildren.end();
218*b1cdbd2cSJim Jagielski         aItr = maChildren.begin() + nNewIndex + 1;
219*b1cdbd2cSJim Jagielski         uno::Reference< XAccessible > xTempAcc;
220*b1cdbd2cSJim Jagielski         sal_Int32 nIndex = nNewIndex + 1;
221*b1cdbd2cSJim Jagielski         while (aItr != aEndItr)
222*b1cdbd2cSJim Jagielski         {
223*b1cdbd2cSJim Jagielski             xTempAcc = aItr->xWeakAcc;
224*b1cdbd2cSJim Jagielski             if (xTempAcc.is() && aItr->pAcc)
225*b1cdbd2cSJim Jagielski                 aItr->pAcc->SetIndex(nIndex);
226*b1cdbd2cSJim Jagielski             ++nIndex;
227*b1cdbd2cSJim Jagielski             ++aItr;
228*b1cdbd2cSJim Jagielski         }
229*b1cdbd2cSJim Jagielski         bAdded = sal_True;
230*b1cdbd2cSJim Jagielski     }
231*b1cdbd2cSJim Jagielski     else
232*b1cdbd2cSJim Jagielski     {
233*b1cdbd2cSJim Jagielski         DBG_ERRORFILE("did not recognize a child count change");
234*b1cdbd2cSJim Jagielski     }
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski     if (bAdded)
237*b1cdbd2cSJim Jagielski     {
238*b1cdbd2cSJim Jagielski 		AccessibleEventObject aEvent;
239*b1cdbd2cSJim Jagielski 		aEvent.EventId = AccessibleEventId::CHILD;
240*b1cdbd2cSJim Jagielski 		aEvent.Source = uno::Reference< XAccessibleContext >(this);
241*b1cdbd2cSJim Jagielski 		aEvent.NewValue <<= getAccessibleChild(nNewIndex);
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski 		CommitChange(aEvent); // new child - event
244*b1cdbd2cSJim Jagielski     }
245*b1cdbd2cSJim Jagielski }
246*b1cdbd2cSJim Jagielski 
RemoveField(sal_Int32 nOldIndex)247*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotControl::RemoveField(sal_Int32 nOldIndex)
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski     sal_Bool bRemoved(sal_False);
250*b1cdbd2cSJim Jagielski     uno::Reference< XAccessible > xTempAcc;
251*b1cdbd2cSJim Jagielski     ScAccessibleDataPilotButton* pField = NULL;
252*b1cdbd2cSJim Jagielski     if (static_cast<size_t>(nOldIndex) < maChildren.size())
253*b1cdbd2cSJim Jagielski     {
254*b1cdbd2cSJim Jagielski         xTempAcc = getAccessibleChild(nOldIndex);
255*b1cdbd2cSJim Jagielski         pField = maChildren[nOldIndex].pAcc;
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski         ::std::vector < AccessibleWeak >::iterator aItr = maChildren.begin() + nOldIndex;
258*b1cdbd2cSJim Jagielski         aItr = maChildren.erase(aItr);
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski         ::std::vector < AccessibleWeak >::iterator aEndItr = maChildren.end();
261*b1cdbd2cSJim Jagielski         uno::Reference< XAccessible > xItrAcc;
262*b1cdbd2cSJim Jagielski         while (aItr != aEndItr)
263*b1cdbd2cSJim Jagielski         {
264*b1cdbd2cSJim Jagielski             xItrAcc = aItr->xWeakAcc;
265*b1cdbd2cSJim Jagielski             if (xItrAcc.is() && aItr->pAcc)
266*b1cdbd2cSJim Jagielski                 aItr->pAcc->SetIndex(nOldIndex);
267*b1cdbd2cSJim Jagielski             ++nOldIndex;
268*b1cdbd2cSJim Jagielski             ++aItr;
269*b1cdbd2cSJim Jagielski         }
270*b1cdbd2cSJim Jagielski         bRemoved = sal_True;
271*b1cdbd2cSJim Jagielski     }
272*b1cdbd2cSJim Jagielski     else
273*b1cdbd2cSJim Jagielski     {
274*b1cdbd2cSJim Jagielski         DBG_ERRORFILE("did not recognize a child count change");
275*b1cdbd2cSJim Jagielski     }
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski     if (bRemoved)
278*b1cdbd2cSJim Jagielski     {
279*b1cdbd2cSJim Jagielski 		AccessibleEventObject aEvent;
280*b1cdbd2cSJim Jagielski 		aEvent.EventId = AccessibleEventId::CHILD;
281*b1cdbd2cSJim Jagielski 		aEvent.Source = uno::Reference< XAccessibleContext >(this);
282*b1cdbd2cSJim Jagielski 		aEvent.NewValue <<= xTempAcc;
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 		CommitChange(aEvent); // gone child - event
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski         if (pField)
287*b1cdbd2cSJim Jagielski             pField->dispose();
288*b1cdbd2cSJim Jagielski     }
289*b1cdbd2cSJim Jagielski }
290*b1cdbd2cSJim Jagielski 
FieldFocusChange(sal_Int32 nOldIndex,sal_Int32 nNewIndex)291*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotControl::FieldFocusChange(sal_Int32 nOldIndex, sal_Int32 nNewIndex)
292*b1cdbd2cSJim Jagielski {
293*b1cdbd2cSJim Jagielski     DBG_ASSERT(static_cast<size_t>(nOldIndex) < maChildren.size() &&
294*b1cdbd2cSJim Jagielski                 static_cast<size_t>(nNewIndex) < maChildren.size(), "did not recognize a child count change");
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski     uno::Reference < XAccessible > xTempAcc = maChildren[nOldIndex].xWeakAcc;
297*b1cdbd2cSJim Jagielski     if (xTempAcc.is() && maChildren[nOldIndex].pAcc)
298*b1cdbd2cSJim Jagielski         maChildren[nOldIndex].pAcc->ResetFocused();
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski     xTempAcc = maChildren[nNewIndex].xWeakAcc;
301*b1cdbd2cSJim Jagielski     if (xTempAcc.is() && maChildren[nNewIndex].pAcc)
302*b1cdbd2cSJim Jagielski         maChildren[nNewIndex].pAcc->SetFocused();
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
FieldNameChange(sal_Int32 nIndex)305*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotControl::FieldNameChange(sal_Int32 nIndex)
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski     DBG_ASSERT(static_cast<size_t>(nIndex) < maChildren.size(), "did not recognize a child count change");
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski     uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc;
310*b1cdbd2cSJim Jagielski     if (xTempAcc.is() && maChildren[nIndex].pAcc)
311*b1cdbd2cSJim Jagielski         maChildren[nIndex].pAcc->ChangeName();
312*b1cdbd2cSJim Jagielski }
313*b1cdbd2cSJim Jagielski 
GotFocus()314*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotControl::GotFocus()
315*b1cdbd2cSJim Jagielski {
316*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
317*b1cdbd2cSJim Jagielski     {
318*b1cdbd2cSJim Jagielski         DBG_ASSERT(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change");
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski 		if(maChildren.size()==0)
321*b1cdbd2cSJim Jagielski 			return ;
322*b1cdbd2cSJim Jagielski         sal_Int32 nIndex(mpFieldWindow->GetSelectedIndex());
323*b1cdbd2cSJim Jagielski         uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc;
324*b1cdbd2cSJim Jagielski         if (xTempAcc.is() && maChildren[nIndex].pAcc)
325*b1cdbd2cSJim Jagielski             maChildren[nIndex].pAcc->SetFocused();
326*b1cdbd2cSJim Jagielski     }
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski 
LostFocus()329*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotControl::LostFocus()
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
332*b1cdbd2cSJim Jagielski     {
333*b1cdbd2cSJim Jagielski         DBG_ASSERT(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change");
334*b1cdbd2cSJim Jagielski 		if(maChildren.size()==0)
335*b1cdbd2cSJim Jagielski 			return ;
336*b1cdbd2cSJim Jagielski         sal_Int32 nIndex(mpFieldWindow->GetSelectedIndex());
337*b1cdbd2cSJim Jagielski         uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc;
338*b1cdbd2cSJim Jagielski         if (xTempAcc.is() && maChildren[nIndex].pAcc)
339*b1cdbd2cSJim Jagielski             maChildren[nIndex].pAcc->ResetFocused();
340*b1cdbd2cSJim Jagielski     }
341*b1cdbd2cSJim Jagielski }
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski 	///=====  XAccessibleComponent  ============================================
344*b1cdbd2cSJim Jagielski 
getAccessibleAtPoint(const awt::Point & rPoint)345*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessibleDataPilotControl::getAccessibleAtPoint(
346*b1cdbd2cSJim Jagielski 		const awt::Point& rPoint )
347*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException)
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski     uno::Reference<XAccessible> xAcc;
350*b1cdbd2cSJim Jagielski     if (containsPoint(rPoint))
351*b1cdbd2cSJim Jagielski     {
352*b1cdbd2cSJim Jagielski         ScUnoGuard aGuard;
353*b1cdbd2cSJim Jagielski         IsObjectValid();
354*b1cdbd2cSJim Jagielski         if (mpFieldWindow)
355*b1cdbd2cSJim Jagielski         {
356*b1cdbd2cSJim Jagielski             Point aAbsPoint(VCLPoint(rPoint));
357*b1cdbd2cSJim Jagielski             Point aControlEdge(GetBoundingBoxOnScreen().TopLeft());
358*b1cdbd2cSJim Jagielski             Point aRelPoint(aAbsPoint - aControlEdge);
359*b1cdbd2cSJim Jagielski             size_t nChildIndex = mpFieldWindow->GetFieldIndex( aRelPoint );
360*b1cdbd2cSJim Jagielski             if( nChildIndex != PIVOTFIELD_INVALID )
361*b1cdbd2cSJim Jagielski                 xAcc = getAccessibleChild(static_cast< long >( nChildIndex ));
362*b1cdbd2cSJim Jagielski         }
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski     return xAcc;
365*b1cdbd2cSJim Jagielski }
366*b1cdbd2cSJim Jagielski 
isVisible()367*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScAccessibleDataPilotControl::isVisible(  )
368*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException)
369*b1cdbd2cSJim Jagielski {
370*b1cdbd2cSJim Jagielski     return sal_True;
371*b1cdbd2cSJim Jagielski }
372*b1cdbd2cSJim Jagielski 
grabFocus()373*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessibleDataPilotControl::grabFocus(  )
374*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException)
375*b1cdbd2cSJim Jagielski {
376*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
377*b1cdbd2cSJim Jagielski     IsObjectValid();
378*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
379*b1cdbd2cSJim Jagielski         mpFieldWindow->GrabFocus();
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski 
getForeground()382*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getForeground(  )
383*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
384*b1cdbd2cSJim Jagielski {
385*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
386*b1cdbd2cSJim Jagielski     IsObjectValid();
387*b1cdbd2cSJim Jagielski     sal_Int32 nColor(0);
388*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
389*b1cdbd2cSJim Jagielski     {
390*b1cdbd2cSJim Jagielski         nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetWindowTextColor().GetColor();
391*b1cdbd2cSJim Jagielski     }
392*b1cdbd2cSJim Jagielski     return nColor;
393*b1cdbd2cSJim Jagielski }
394*b1cdbd2cSJim Jagielski 
getBackground()395*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getBackground(  )
396*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
397*b1cdbd2cSJim Jagielski {
398*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
399*b1cdbd2cSJim Jagielski     IsObjectValid();
400*b1cdbd2cSJim Jagielski     sal_Int32 nColor(0);
401*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
402*b1cdbd2cSJim Jagielski     {
403*b1cdbd2cSJim Jagielski         const StyleSettings& rStyleSett = mpFieldWindow->GetSettings().GetStyleSettings();
404*b1cdbd2cSJim Jagielski         nColor = (mpFieldWindow->GetType() == PIVOTFIELDTYPE_SELECT) ? rStyleSett.GetFaceColor().GetColor() : rStyleSett.GetWindowColor().GetColor();
405*b1cdbd2cSJim Jagielski     }
406*b1cdbd2cSJim Jagielski     return nColor;
407*b1cdbd2cSJim Jagielski }
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 	///=====  XAccessibleContext  ==============================================
410*b1cdbd2cSJim Jagielski 
getAccessibleChildCount(void)411*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getAccessibleChildCount(void)
412*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException)
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
415*b1cdbd2cSJim Jagielski     IsObjectValid();
416*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
417*b1cdbd2cSJim Jagielski         return mpFieldWindow->GetFieldCount();
418*b1cdbd2cSJim Jagielski     else
419*b1cdbd2cSJim Jagielski         return 0;
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
getAccessibleChild(sal_Int32 nIndex)422*b1cdbd2cSJim Jagielski uno::Reference< XAccessible> SAL_CALL ScAccessibleDataPilotControl::getAccessibleChild(sal_Int32 nIndex)
423*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
424*b1cdbd2cSJim Jagielski {
425*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
426*b1cdbd2cSJim Jagielski     IsObjectValid();
427*b1cdbd2cSJim Jagielski     uno::Reference<XAccessible> xAcc;
428*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
429*b1cdbd2cSJim Jagielski     {
430*b1cdbd2cSJim Jagielski         if (nIndex < 0 || static_cast< size_t >( nIndex ) >= mpFieldWindow->GetFieldCount())
431*b1cdbd2cSJim Jagielski             throw lang::IndexOutOfBoundsException();
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski         DBG_ASSERT(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change");
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski         uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc;
436*b1cdbd2cSJim Jagielski         if (!xTempAcc.is())
437*b1cdbd2cSJim Jagielski         {
438*b1cdbd2cSJim Jagielski             maChildren[nIndex].pAcc = new ScAccessibleDataPilotButton(this, mpFieldWindow, nIndex);
439*b1cdbd2cSJim Jagielski             xTempAcc = maChildren[nIndex].pAcc;
440*b1cdbd2cSJim Jagielski             maChildren[nIndex].xWeakAcc = xTempAcc;
441*b1cdbd2cSJim Jagielski         }
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski         xAcc = xTempAcc;
444*b1cdbd2cSJim Jagielski     }
445*b1cdbd2cSJim Jagielski     return xAcc;
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
getAccessibleStateSet(void)448*b1cdbd2cSJim Jagielski uno::Reference<XAccessibleStateSet> SAL_CALL ScAccessibleDataPilotControl::getAccessibleStateSet(void)
449*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException)
450*b1cdbd2cSJim Jagielski {
451*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
452*b1cdbd2cSJim Jagielski     IsObjectValid();
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski 	utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski     if (IsDefunc())
457*b1cdbd2cSJim Jagielski         pStateSet->AddState(AccessibleStateType::DEFUNC);
458*b1cdbd2cSJim Jagielski     else
459*b1cdbd2cSJim Jagielski     {
460*b1cdbd2cSJim Jagielski         pStateSet->AddState(AccessibleStateType::ENABLED);
461*b1cdbd2cSJim Jagielski         pStateSet->AddState(AccessibleStateType::OPAQUE);
462*b1cdbd2cSJim Jagielski         if (isShowing())
463*b1cdbd2cSJim Jagielski             pStateSet->AddState(AccessibleStateType::SHOWING);
464*b1cdbd2cSJim Jagielski         if (isVisible())
465*b1cdbd2cSJim Jagielski             pStateSet->AddState(AccessibleStateType::VISIBLE);
466*b1cdbd2cSJim Jagielski     }
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski     return pStateSet;
469*b1cdbd2cSJim Jagielski }
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski 	///=====  XServiceInfo  ====================================================
472*b1cdbd2cSJim Jagielski 
getImplementationName(void)473*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::getImplementationName(void)
474*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException)
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski     return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleDataPilotControl"));
477*b1cdbd2cSJim Jagielski }
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 	///=====  XTypeProvider  ===================================================
480*b1cdbd2cSJim Jagielski 
getImplementationId(void)481*b1cdbd2cSJim Jagielski uno::Sequence<sal_Int8> SAL_CALL ScAccessibleDataPilotControl::getImplementationId(void)
482*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException)
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
485*b1cdbd2cSJim Jagielski     IsObjectValid();
486*b1cdbd2cSJim Jagielski 	static uno::Sequence<sal_Int8> aId;
487*b1cdbd2cSJim Jagielski 	if (aId.getLength() == 0)
488*b1cdbd2cSJim Jagielski 	{
489*b1cdbd2cSJim Jagielski 		aId.realloc (16);
490*b1cdbd2cSJim Jagielski 		rtl_createUuid (reinterpret_cast<sal_uInt8 *>(aId.getArray()), 0, sal_True);
491*b1cdbd2cSJim Jagielski 	}
492*b1cdbd2cSJim Jagielski 	return aId;
493*b1cdbd2cSJim Jagielski }
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 	//=====  internal  ========================================================
496*b1cdbd2cSJim Jagielski 
createAccessibleDescription(void)497*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::createAccessibleDescription(void)
498*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException)
499*b1cdbd2cSJim Jagielski {
500*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
501*b1cdbd2cSJim Jagielski     IsObjectValid();
502*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
503*b1cdbd2cSJim Jagielski         return mpFieldWindow->GetDescription();
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski     return rtl::OUString();
506*b1cdbd2cSJim Jagielski }
507*b1cdbd2cSJim Jagielski 
createAccessibleName(void)508*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::createAccessibleName(void)
509*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException)
510*b1cdbd2cSJim Jagielski {
511*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
512*b1cdbd2cSJim Jagielski     IsObjectValid();
513*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
514*b1cdbd2cSJim Jagielski         return mpFieldWindow->GetName();
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski     return rtl::OUString();
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski 
GetBoundingBoxOnScreen(void) const519*b1cdbd2cSJim Jagielski Rectangle ScAccessibleDataPilotControl::GetBoundingBoxOnScreen(void) const
520*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException)
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski 	if (mpFieldWindow)
523*b1cdbd2cSJim Jagielski 		return mpFieldWindow->GetWindowExtentsRelative(NULL);
524*b1cdbd2cSJim Jagielski     else
525*b1cdbd2cSJim Jagielski 	    return Rectangle();
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski 
GetBoundingBox(void) const528*b1cdbd2cSJim Jagielski Rectangle ScAccessibleDataPilotControl::GetBoundingBox(void) const
529*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException)
530*b1cdbd2cSJim Jagielski {
531*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
532*b1cdbd2cSJim Jagielski         return mpFieldWindow->GetWindowExtentsRelative(mpFieldWindow->GetAccessibleParentWindow());
533*b1cdbd2cSJim Jagielski     else
534*b1cdbd2cSJim Jagielski         return Rectangle();
535*b1cdbd2cSJim Jagielski }
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski //===============================================================================
539*b1cdbd2cSJim Jagielski 
ScAccessibleDataPilotButton(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> & rxParent,ScPivotFieldWindow * pFieldWindow,sal_Int32 nIndex)540*b1cdbd2cSJim Jagielski ScAccessibleDataPilotButton::ScAccessibleDataPilotButton(
541*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
542*b1cdbd2cSJim Jagielski         ::com::sun::star::accessibility::XAccessible>& rxParent,
543*b1cdbd2cSJim Jagielski         ScPivotFieldWindow* pFieldWindow,
544*b1cdbd2cSJim Jagielski         sal_Int32 nIndex)
545*b1cdbd2cSJim Jagielski //change role frome PUSH_BUTTON to BUTTON_MENU
546*b1cdbd2cSJim Jagielski     : ScAccessibleContextBase(rxParent, AccessibleRole::BUTTON_MENU),
547*b1cdbd2cSJim Jagielski     mpFieldWindow(pFieldWindow),
548*b1cdbd2cSJim Jagielski     mnIndex(nIndex)
549*b1cdbd2cSJim Jagielski {
550*b1cdbd2cSJim Jagielski }
551*b1cdbd2cSJim Jagielski 
~ScAccessibleDataPilotButton(void)552*b1cdbd2cSJim Jagielski ScAccessibleDataPilotButton::~ScAccessibleDataPilotButton(void)
553*b1cdbd2cSJim Jagielski {
554*b1cdbd2cSJim Jagielski 	if (!IsDefunc() && !rBHelper.bInDispose)
555*b1cdbd2cSJim Jagielski 	{
556*b1cdbd2cSJim Jagielski 		// increment refcount to prevent double call off dtor
557*b1cdbd2cSJim Jagielski 		osl_incrementInterlockedCount( &m_refCount );
558*b1cdbd2cSJim Jagielski 		// call dispose to inform object wich have a weak reference to this object
559*b1cdbd2cSJim Jagielski 		dispose();
560*b1cdbd2cSJim Jagielski 	}
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski 
Init()563*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotButton::Init()
564*b1cdbd2cSJim Jagielski {
565*b1cdbd2cSJim Jagielski }
566*b1cdbd2cSJim Jagielski 
disposing()567*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessibleDataPilotButton::disposing()
568*b1cdbd2cSJim Jagielski {
569*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
570*b1cdbd2cSJim Jagielski     mpFieldWindow = NULL;
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski     ScAccessibleContextBase::disposing();
573*b1cdbd2cSJim Jagielski }
574*b1cdbd2cSJim Jagielski 
SetFocused()575*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotButton::SetFocused()
576*b1cdbd2cSJim Jagielski {
577*b1cdbd2cSJim Jagielski 	CommitFocusGained();
578*b1cdbd2cSJim Jagielski }
579*b1cdbd2cSJim Jagielski 
ResetFocused()580*b1cdbd2cSJim Jagielski void ScAccessibleDataPilotButton::ResetFocused()
581*b1cdbd2cSJim Jagielski {
582*b1cdbd2cSJim Jagielski 	CommitFocusLost();
583*b1cdbd2cSJim Jagielski }
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 	///=====  XAccessibleComponent  ============================================
586*b1cdbd2cSJim Jagielski 
getAccessibleAtPoint(const::com::sun::star::awt::Point &)587*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessibleDataPilotButton::getAccessibleAtPoint(
588*b1cdbd2cSJim Jagielski         const ::com::sun::star::awt::Point& /* rPoint */ )
589*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException)
590*b1cdbd2cSJim Jagielski {
591*b1cdbd2cSJim Jagielski     return NULL;
592*b1cdbd2cSJim Jagielski }
593*b1cdbd2cSJim Jagielski 
isVisible()594*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScAccessibleDataPilotButton::isVisible(  )
595*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException)
596*b1cdbd2cSJim Jagielski {
597*b1cdbd2cSJim Jagielski     return sal_True;
598*b1cdbd2cSJim Jagielski }
599*b1cdbd2cSJim Jagielski 
grabFocus()600*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessibleDataPilotButton::grabFocus(  )
601*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException)
602*b1cdbd2cSJim Jagielski {
603*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
604*b1cdbd2cSJim Jagielski     IsObjectValid();
605*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
606*b1cdbd2cSJim Jagielski     {
607*b1cdbd2cSJim Jagielski         mpFieldWindow->GrabFocusAndSelect(getAccessibleIndexInParent());
608*b1cdbd2cSJim Jagielski     }
609*b1cdbd2cSJim Jagielski }
610*b1cdbd2cSJim Jagielski 
getForeground()611*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getForeground(  )
612*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
613*b1cdbd2cSJim Jagielski {
614*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
615*b1cdbd2cSJim Jagielski     IsObjectValid();
616*b1cdbd2cSJim Jagielski     sal_Int32 nColor(0);
617*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
618*b1cdbd2cSJim Jagielski     {
619*b1cdbd2cSJim Jagielski         nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetButtonTextColor().GetColor();
620*b1cdbd2cSJim Jagielski     }
621*b1cdbd2cSJim Jagielski     return nColor;
622*b1cdbd2cSJim Jagielski }
623*b1cdbd2cSJim Jagielski 
getBackground()624*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getBackground(  )
625*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
626*b1cdbd2cSJim Jagielski {
627*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
628*b1cdbd2cSJim Jagielski     IsObjectValid();
629*b1cdbd2cSJim Jagielski     sal_Int32 nColor(0);
630*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
631*b1cdbd2cSJim Jagielski     {
632*b1cdbd2cSJim Jagielski         nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetFaceColor().GetColor();
633*b1cdbd2cSJim Jagielski     }
634*b1cdbd2cSJim Jagielski     return nColor;
635*b1cdbd2cSJim Jagielski }
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 	///=====  XAccessibleContext  ==============================================
638*b1cdbd2cSJim Jagielski 
getAccessibleChildCount(void)639*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getAccessibleChildCount(void)
640*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
641*b1cdbd2cSJim Jagielski {
642*b1cdbd2cSJim Jagielski     return 0;
643*b1cdbd2cSJim Jagielski }
644*b1cdbd2cSJim Jagielski 
getAccessibleChild(sal_Int32)645*b1cdbd2cSJim Jagielski uno::Reference< XAccessible> SAL_CALL ScAccessibleDataPilotButton::getAccessibleChild(sal_Int32 /* nIndex */)
646*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException,
647*b1cdbd2cSJim Jagielski 				::com::sun::star::lang::IndexOutOfBoundsException)
648*b1cdbd2cSJim Jagielski {
649*b1cdbd2cSJim Jagielski     throw lang::IndexOutOfBoundsException();
650*b1cdbd2cSJim Jagielski }
651*b1cdbd2cSJim Jagielski 
getAccessibleIndexInParent(void)652*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getAccessibleIndexInParent(void)
653*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException)
654*b1cdbd2cSJim Jagielski {
655*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
656*b1cdbd2cSJim Jagielski     IsObjectValid();
657*b1cdbd2cSJim Jagielski     return mnIndex;
658*b1cdbd2cSJim Jagielski }
659*b1cdbd2cSJim Jagielski 
getAccessibleStateSet(void)660*b1cdbd2cSJim Jagielski uno::Reference<XAccessibleStateSet> SAL_CALL ScAccessibleDataPilotButton::getAccessibleStateSet(void)
661*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException)
662*b1cdbd2cSJim Jagielski {
663*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
664*b1cdbd2cSJim Jagielski     IsObjectValid();
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski 	utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski     if (IsDefunc())
669*b1cdbd2cSJim Jagielski         pStateSet->AddState(AccessibleStateType::DEFUNC);
670*b1cdbd2cSJim Jagielski     else
671*b1cdbd2cSJim Jagielski     {
672*b1cdbd2cSJim Jagielski         pStateSet->AddState(AccessibleStateType::ENABLED);
673*b1cdbd2cSJim Jagielski         pStateSet->AddState(AccessibleStateType::OPAQUE);
674*b1cdbd2cSJim Jagielski         pStateSet->AddState(AccessibleStateType::FOCUSABLE);
675*b1cdbd2cSJim Jagielski         if (mpFieldWindow && (sal::static_int_cast<sal_Int32>(mpFieldWindow->GetSelectedIndex()) == mnIndex))
676*b1cdbd2cSJim Jagielski             pStateSet->AddState(AccessibleStateType::FOCUSED);
677*b1cdbd2cSJim Jagielski         if (isShowing())
678*b1cdbd2cSJim Jagielski             pStateSet->AddState(AccessibleStateType::SHOWING);
679*b1cdbd2cSJim Jagielski         if (isVisible())
680*b1cdbd2cSJim Jagielski             pStateSet->AddState(AccessibleStateType::VISIBLE);
681*b1cdbd2cSJim Jagielski     }
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski     return pStateSet;
684*b1cdbd2cSJim Jagielski }
685*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet >
getAccessibleRelationSet()686*b1cdbd2cSJim Jagielski 	SAL_CALL ScAccessibleDataPilotButton::getAccessibleRelationSet(	) throw (::com::sun::star::uno::RuntimeException)
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski 	utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper;
689*b1cdbd2cSJim Jagielski 	uno::Reference< accessibility::XAccessibleRelationSet > xSet = pRelationSetHelper;
690*b1cdbd2cSJim Jagielski 	if(mxParent.is())
691*b1cdbd2cSJim Jagielski 	{
692*b1cdbd2cSJim Jagielski 		uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1);
693*b1cdbd2cSJim Jagielski 		aSequence[0] = mxParent;
694*b1cdbd2cSJim Jagielski 		pRelationSetHelper->AddRelation( accessibility::AccessibleRelation( accessibility::AccessibleRelationType::MEMBER_OF, aSequence ) );
695*b1cdbd2cSJim Jagielski 	}
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski 	return xSet;
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski }
700*b1cdbd2cSJim Jagielski 	///=====  XServiceInfo  ====================================================
701*b1cdbd2cSJim Jagielski 
getImplementationName(void)702*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::getImplementationName(void)
703*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException)
704*b1cdbd2cSJim Jagielski {
705*b1cdbd2cSJim Jagielski     return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleDataPilotButton"));
706*b1cdbd2cSJim Jagielski }
707*b1cdbd2cSJim Jagielski 
708*b1cdbd2cSJim Jagielski 	///=====  XTypeProvider  ===================================================
709*b1cdbd2cSJim Jagielski 
getImplementationId(void)710*b1cdbd2cSJim Jagielski uno::Sequence<sal_Int8> SAL_CALL ScAccessibleDataPilotButton::getImplementationId(void)
711*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException)
712*b1cdbd2cSJim Jagielski {
713*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
714*b1cdbd2cSJim Jagielski     IsObjectValid();
715*b1cdbd2cSJim Jagielski 	static uno::Sequence<sal_Int8> aId;
716*b1cdbd2cSJim Jagielski 	if (aId.getLength() == 0)
717*b1cdbd2cSJim Jagielski 	{
718*b1cdbd2cSJim Jagielski 		aId.realloc (16);
719*b1cdbd2cSJim Jagielski 		rtl_createUuid (reinterpret_cast<sal_uInt8 *>(aId.getArray()), 0, sal_True);
720*b1cdbd2cSJim Jagielski 	}
721*b1cdbd2cSJim Jagielski 	return aId;
722*b1cdbd2cSJim Jagielski }
723*b1cdbd2cSJim Jagielski 
createAccessibleDescription(void)724*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::createAccessibleDescription(void)
725*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException)
726*b1cdbd2cSJim Jagielski {
727*b1cdbd2cSJim Jagielski 	 if (mpFieldWindow)
728*b1cdbd2cSJim Jagielski         return mpFieldWindow->GetHelpText();
729*b1cdbd2cSJim Jagielski     return rtl::OUString();
730*b1cdbd2cSJim Jagielski }
731*b1cdbd2cSJim Jagielski 
createAccessibleName(void)732*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::createAccessibleName(void)
733*b1cdbd2cSJim Jagielski         throw (::com::sun::star::uno::RuntimeException)
734*b1cdbd2cSJim Jagielski {
735*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
736*b1cdbd2cSJim Jagielski     IsObjectValid();
737*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
738*b1cdbd2cSJim Jagielski         return mpFieldWindow->GetFieldText(getAccessibleIndexInParent());
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski     return rtl::OUString();
741*b1cdbd2cSJim Jagielski }
742*b1cdbd2cSJim Jagielski 
GetBoundingBoxOnScreen(void) const743*b1cdbd2cSJim Jagielski Rectangle ScAccessibleDataPilotButton::GetBoundingBoxOnScreen(void) const
744*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException)
745*b1cdbd2cSJim Jagielski {
746*b1cdbd2cSJim Jagielski     Rectangle aRect(GetBoundingBox());
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
749*b1cdbd2cSJim Jagielski     {
750*b1cdbd2cSJim Jagielski         Point aParentPos(mpFieldWindow->GetWindowExtentsRelative(NULL).TopLeft());
751*b1cdbd2cSJim Jagielski         aRect.Move(aParentPos.getX(), aParentPos.getY());
752*b1cdbd2cSJim Jagielski     }
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski     return aRect;
755*b1cdbd2cSJim Jagielski }
756*b1cdbd2cSJim Jagielski 
GetBoundingBox(void) const757*b1cdbd2cSJim Jagielski Rectangle ScAccessibleDataPilotButton::GetBoundingBox(void) const
758*b1cdbd2cSJim Jagielski 		throw (::com::sun::star::uno::RuntimeException)
759*b1cdbd2cSJim Jagielski {
760*b1cdbd2cSJim Jagielski     if (mpFieldWindow)
761*b1cdbd2cSJim Jagielski         return Rectangle (mpFieldWindow->GetFieldPosition(const_cast<ScAccessibleDataPilotButton*> (this)->getAccessibleIndexInParent()), mpFieldWindow->GetFieldSize());
762*b1cdbd2cSJim Jagielski     else
763*b1cdbd2cSJim Jagielski         return Rectangle();
764*b1cdbd2cSJim Jagielski }
765*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
766*b1cdbd2cSJim Jagielski // XAccessibleAction
767*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getAccessibleActionCount()768*b1cdbd2cSJim Jagielski sal_Int32 ScAccessibleDataPilotButton::getAccessibleActionCount( ) throw (uno::RuntimeException)
769*b1cdbd2cSJim Jagielski {
770*b1cdbd2cSJim Jagielski 	return 1;
771*b1cdbd2cSJim Jagielski }
772*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
doAccessibleAction(sal_Int32 nIndex)773*b1cdbd2cSJim Jagielski sal_Bool ScAccessibleDataPilotButton::doAccessibleAction ( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
774*b1cdbd2cSJim Jagielski {
775*b1cdbd2cSJim Jagielski 	if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
776*b1cdbd2cSJim Jagielski         throw lang::IndexOutOfBoundsException();
777*b1cdbd2cSJim Jagielski 	return sal_True;
778*b1cdbd2cSJim Jagielski }
779*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getAccessibleActionDescription(sal_Int32 nIndex)780*b1cdbd2cSJim Jagielski ::rtl::OUString ScAccessibleDataPilotButton::getAccessibleActionDescription ( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
781*b1cdbd2cSJim Jagielski {
782*b1cdbd2cSJim Jagielski 	if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
783*b1cdbd2cSJim Jagielski         throw lang::IndexOutOfBoundsException();
784*b1cdbd2cSJim Jagielski 	return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(  "press" ) );
785*b1cdbd2cSJim Jagielski }
786*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getAccessibleActionKeyBinding(sal_Int32 nIndex)787*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< XAccessibleKeyBinding > ScAccessibleDataPilotButton::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
788*b1cdbd2cSJim Jagielski {
789*b1cdbd2cSJim Jagielski     if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
790*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
791*b1cdbd2cSJim Jagielski 	  comphelper::OAccessibleKeyBindingHelper* pKeyBindingHelper = new comphelper::OAccessibleKeyBindingHelper();
792*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< XAccessibleKeyBinding > xKeyBinding = pKeyBindingHelper;
793*b1cdbd2cSJim Jagielski     ScPivotFieldWindow* pWindow = mpFieldWindow;
794*b1cdbd2cSJim Jagielski     if ( pWindow )
795*b1cdbd2cSJim Jagielski     {
796*b1cdbd2cSJim Jagielski         awt::KeyStroke aKeyStroke;
797*b1cdbd2cSJim Jagielski         aKeyStroke.Modifiers = 0;
798*b1cdbd2cSJim Jagielski         aKeyStroke.KeyCode = KEY_SPACE;
799*b1cdbd2cSJim Jagielski         pKeyBindingHelper->AddKeyBinding( aKeyStroke );
800*b1cdbd2cSJim Jagielski     }
801*b1cdbd2cSJim Jagielski     return xKeyBinding;
802*b1cdbd2cSJim Jagielski }
803*b1cdbd2cSJim Jagielski //=====  XInterface  =====================================================
queryInterface(uno::Type const & rType)804*b1cdbd2cSJim Jagielski uno::Any SAL_CALL ScAccessibleDataPilotButton::queryInterface( uno::Type const & rType )
805*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::RuntimeException)
806*b1cdbd2cSJim Jagielski {
807*b1cdbd2cSJim Jagielski 	uno::Any aAny (ScAccessibleContextBase::queryInterface(rType));
808*b1cdbd2cSJim Jagielski 	if(!aAny.hasValue())
809*b1cdbd2cSJim Jagielski 	{
810*b1cdbd2cSJim Jagielski 	  aAny = ::cppu::queryInterface (rType,
811*b1cdbd2cSJim Jagielski             static_cast<XAccessibleAction*>(this)
812*b1cdbd2cSJim Jagielski             );
813*b1cdbd2cSJim Jagielski 	}
814*b1cdbd2cSJim Jagielski     return aAny;
815*b1cdbd2cSJim Jagielski }
acquire()816*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessibleDataPilotButton::acquire()
817*b1cdbd2cSJim Jagielski 	throw ()
818*b1cdbd2cSJim Jagielski {
819*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase::acquire();
820*b1cdbd2cSJim Jagielski }
release()821*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessibleDataPilotButton::release()
822*b1cdbd2cSJim Jagielski 	throw ()
823*b1cdbd2cSJim Jagielski {
824*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase::release();
825*b1cdbd2cSJim Jagielski }
826*b1cdbd2cSJim Jagielski 
827