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 
27*b1cdbd2cSJim Jagielski #include "AccessiblePageHeader.hxx"
28*b1cdbd2cSJim Jagielski #include "AccessiblePageHeaderArea.hxx"
29*b1cdbd2cSJim Jagielski #include "AccessibilityHints.hxx"
30*b1cdbd2cSJim Jagielski #include "prevwsh.hxx"
31*b1cdbd2cSJim Jagielski #include "unoguard.hxx"
32*b1cdbd2cSJim Jagielski #include "miscuno.hxx"
33*b1cdbd2cSJim Jagielski #include "prevloc.hxx"
34*b1cdbd2cSJim Jagielski #include "document.hxx"
35*b1cdbd2cSJim Jagielski #include "stlpool.hxx"
36*b1cdbd2cSJim Jagielski #include "scitems.hxx"
37*b1cdbd2cSJim Jagielski #include "attrib.hxx"
38*b1cdbd2cSJim Jagielski #include "scresid.hxx"
39*b1cdbd2cSJim Jagielski #ifndef SC_SC_HRC
40*b1cdbd2cSJim Jagielski #include "sc.hrc"
41*b1cdbd2cSJim Jagielski #endif
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleRole.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleStateType.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleEventId.hpp>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
48*b1cdbd2cSJim Jagielski #include <svl/smplhint.hxx>
49*b1cdbd2cSJim Jagielski #include <unotools/accessiblestatesethelper.hxx>
50*b1cdbd2cSJim Jagielski #include <svl/style.hxx>
51*b1cdbd2cSJim Jagielski #include <svl/itempool.hxx>
52*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
53*b1cdbd2cSJim Jagielski #include <toolkit/helper/convert.hxx>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #include <algorithm>
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski using namespace	::com::sun::star;
58*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::accessibility;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski const sal_uInt8     MAX_AREAS = 3;
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski //=====  internal  ============================================================
63*b1cdbd2cSJim Jagielski struct Acquire
64*b1cdbd2cSJim Jagielski {
operator ()Acquire65*b1cdbd2cSJim Jagielski 	void operator() (ScAccessiblePageHeaderArea* pArea)
66*b1cdbd2cSJim Jagielski 	{
67*b1cdbd2cSJim Jagielski         if (pArea)
68*b1cdbd2cSJim Jagielski             pArea->acquire();
69*b1cdbd2cSJim Jagielski 	}
70*b1cdbd2cSJim Jagielski };
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski struct Release
73*b1cdbd2cSJim Jagielski {
operator ()Release74*b1cdbd2cSJim Jagielski 	void operator() (ScAccessiblePageHeaderArea*& pArea)
75*b1cdbd2cSJim Jagielski 	{
76*b1cdbd2cSJim Jagielski         if (pArea)
77*b1cdbd2cSJim Jagielski             pArea->release();
78*b1cdbd2cSJim Jagielski 	}
79*b1cdbd2cSJim Jagielski };
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski struct Dispose
82*b1cdbd2cSJim Jagielski {
operator ()Dispose83*b1cdbd2cSJim Jagielski 	void operator() (ScAccessiblePageHeaderArea*& pArea)
84*b1cdbd2cSJim Jagielski 	{
85*b1cdbd2cSJim Jagielski         if (pArea)
86*b1cdbd2cSJim Jagielski         {
87*b1cdbd2cSJim Jagielski             pArea->dispose();
88*b1cdbd2cSJim Jagielski             pArea->release();
89*b1cdbd2cSJim Jagielski         }
90*b1cdbd2cSJim Jagielski         pArea = NULL;
91*b1cdbd2cSJim Jagielski 	}
92*b1cdbd2cSJim Jagielski };
93*b1cdbd2cSJim Jagielski 
ScAccessiblePageHeader(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> & rxParent,ScPreviewShell * pViewShell,sal_Bool bHeader,sal_Int32 nIndex)94*b1cdbd2cSJim Jagielski ScAccessiblePageHeader::ScAccessiblePageHeader( const ::com::sun::star::uno::Reference<
95*b1cdbd2cSJim Jagielski 						        ::com::sun::star::accessibility::XAccessible>& rxParent,
96*b1cdbd2cSJim Jagielski 							ScPreviewShell* pViewShell, sal_Bool bHeader, sal_Int32 nIndex ) :
97*b1cdbd2cSJim Jagielski ScAccessibleContextBase( rxParent, bHeader ? AccessibleRole::HEADER : AccessibleRole::FOOTER ),
98*b1cdbd2cSJim Jagielski 	mpViewShell( pViewShell ),
99*b1cdbd2cSJim Jagielski 	mnIndex( nIndex ),
100*b1cdbd2cSJim Jagielski 	mbHeader( bHeader ),
101*b1cdbd2cSJim Jagielski     maAreas(MAX_AREAS, NULL),
102*b1cdbd2cSJim Jagielski     mnChildCount(-1)
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski 	if (mpViewShell)
105*b1cdbd2cSJim Jagielski 		mpViewShell->AddAccessibilityObject(*this);
106*b1cdbd2cSJim Jagielski }
107*b1cdbd2cSJim Jagielski 
~ScAccessiblePageHeader()108*b1cdbd2cSJim Jagielski ScAccessiblePageHeader::~ScAccessiblePageHeader()
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski 	if (!ScAccessibleContextBase::IsDefunc() && !rBHelper.bInDispose)
111*b1cdbd2cSJim Jagielski 	{
112*b1cdbd2cSJim Jagielski 		// increment refcount to prevent double call off dtor
113*b1cdbd2cSJim Jagielski 		osl_incrementInterlockedCount( &m_refCount );
114*b1cdbd2cSJim Jagielski 		dispose();
115*b1cdbd2cSJim Jagielski 	}
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
disposing()118*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessiblePageHeader::disposing()
119*b1cdbd2cSJim Jagielski {
120*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
121*b1cdbd2cSJim Jagielski 	if (mpViewShell)
122*b1cdbd2cSJim Jagielski 	{
123*b1cdbd2cSJim Jagielski 		mpViewShell->RemoveAccessibilityObject(*this);
124*b1cdbd2cSJim Jagielski 		mpViewShell = NULL;
125*b1cdbd2cSJim Jagielski 	}
126*b1cdbd2cSJim Jagielski     std::for_each(maAreas.begin(), maAreas.end(), Dispose());
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase::disposing();
129*b1cdbd2cSJim Jagielski }
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski //=====  SfxListener  =====================================================
132*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)133*b1cdbd2cSJim Jagielski void ScAccessiblePageHeader::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski 	if (rHint.ISA( SfxSimpleHint ) )
136*b1cdbd2cSJim Jagielski 	{
137*b1cdbd2cSJim Jagielski 		const SfxSimpleHint& rRef = (const SfxSimpleHint&)rHint;
138*b1cdbd2cSJim Jagielski 		// only notify if child exist, otherwise it is not necessary
139*b1cdbd2cSJim Jagielski 		if ((rRef.GetId() == SC_HINT_DATACHANGED))
140*b1cdbd2cSJim Jagielski         {
141*b1cdbd2cSJim Jagielski             ScHFAreas aOldAreas(maAreas);
142*b1cdbd2cSJim Jagielski             std::for_each(aOldAreas.begin(), aOldAreas.end(), Acquire());
143*b1cdbd2cSJim Jagielski             mnChildCount = -1;
144*b1cdbd2cSJim Jagielski             getAccessibleChildCount();
145*b1cdbd2cSJim Jagielski             for (sal_uInt8 i = 0; i < MAX_AREAS; ++i)
146*b1cdbd2cSJim Jagielski             {
147*b1cdbd2cSJim Jagielski                 if ((aOldAreas[i] && maAreas[i] && !ScGlobal::EETextObjEqual(aOldAreas[i]->GetEditTextObject(), maAreas[i]->GetEditTextObject())) ||
148*b1cdbd2cSJim Jagielski                     (aOldAreas[i] && !maAreas[i]) || (!aOldAreas[i] && maAreas[i]))
149*b1cdbd2cSJim Jagielski                 {
150*b1cdbd2cSJim Jagielski                     if (aOldAreas[i] && aOldAreas[i]->GetEditTextObject())
151*b1cdbd2cSJim Jagielski                     {
152*b1cdbd2cSJim Jagielski 			            AccessibleEventObject aEvent;
153*b1cdbd2cSJim Jagielski 			            aEvent.EventId = AccessibleEventId::CHILD;
154*b1cdbd2cSJim Jagielski 			            aEvent.Source = uno::Reference< XAccessibleContext >(this);
155*b1cdbd2cSJim Jagielski                         aEvent.OldValue = uno::makeAny(uno::Reference<XAccessible>(aOldAreas[i]));
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 			            CommitChange(aEvent); // child gone - event
158*b1cdbd2cSJim Jagielski                         aOldAreas[i]->dispose();
159*b1cdbd2cSJim Jagielski                     }
160*b1cdbd2cSJim Jagielski                     if (maAreas[i] && maAreas[i]->GetEditTextObject())
161*b1cdbd2cSJim Jagielski                     {
162*b1cdbd2cSJim Jagielski 			            AccessibleEventObject aEvent;
163*b1cdbd2cSJim Jagielski 			            aEvent.EventId = AccessibleEventId::CHILD;
164*b1cdbd2cSJim Jagielski 			            aEvent.Source = uno::Reference< XAccessibleContext >(this);
165*b1cdbd2cSJim Jagielski                         aEvent.NewValue = uno::makeAny(uno::Reference<XAccessible>(maAreas[i]));
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 			            CommitChange(aEvent); // new child - event
168*b1cdbd2cSJim Jagielski                     }
169*b1cdbd2cSJim Jagielski                 }
170*b1cdbd2cSJim Jagielski             }
171*b1cdbd2cSJim Jagielski             std::for_each(aOldAreas.begin(), aOldAreas.end(), Release());
172*b1cdbd2cSJim Jagielski         }
173*b1cdbd2cSJim Jagielski         else if (rRef.GetId() == SC_HINT_ACC_VISAREACHANGED)
174*b1cdbd2cSJim Jagielski         {
175*b1cdbd2cSJim Jagielski             AccessibleEventObject aEvent;
176*b1cdbd2cSJim Jagielski             aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED;
177*b1cdbd2cSJim Jagielski 			aEvent.Source = uno::Reference< XAccessibleContext >(this);
178*b1cdbd2cSJim Jagielski             CommitChange(aEvent);
179*b1cdbd2cSJim Jagielski         }
180*b1cdbd2cSJim Jagielski     }
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase::Notify(rBC, rHint);
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski //=====  XAccessibleComponent  ============================================
186*b1cdbd2cSJim Jagielski 
getAccessibleAtPoint(const awt::Point & aPoint)187*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessiblePageHeader::getAccessibleAtPoint( const awt::Point& aPoint )
188*b1cdbd2cSJim Jagielski     							throw (uno::RuntimeException)
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski 	uno::Reference<XAccessible> xRet;
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski     if (containsPoint(aPoint))
193*b1cdbd2cSJim Jagielski     {
194*b1cdbd2cSJim Jagielski     	ScUnoGuard aGuard;
195*b1cdbd2cSJim Jagielski         IsObjectValid();
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski         sal_Int32 nCount(getAccessibleChildCount()); // fill the areas
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski         if (nCount)
200*b1cdbd2cSJim Jagielski         {
201*b1cdbd2cSJim Jagielski             // return the first with content, because they have all the same Bounding Box
202*b1cdbd2cSJim Jagielski 	        sal_uInt8 i(0);
203*b1cdbd2cSJim Jagielski             while(!xRet.is() && i < MAX_AREAS)
204*b1cdbd2cSJim Jagielski             {
205*b1cdbd2cSJim Jagielski                 if (maAreas[i])
206*b1cdbd2cSJim Jagielski                     xRet = maAreas[i];
207*b1cdbd2cSJim Jagielski                 else
208*b1cdbd2cSJim Jagielski                     ++i;
209*b1cdbd2cSJim Jagielski             }
210*b1cdbd2cSJim Jagielski         }
211*b1cdbd2cSJim Jagielski     }
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 	return xRet;
214*b1cdbd2cSJim Jagielski }
215*b1cdbd2cSJim Jagielski 
grabFocus()216*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessiblePageHeader::grabFocus() throw (uno::RuntimeException)
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski  	ScUnoGuard aGuard;
219*b1cdbd2cSJim Jagielski     IsObjectValid();
220*b1cdbd2cSJim Jagielski 	if (getAccessibleParent().is())
221*b1cdbd2cSJim Jagielski 	{
222*b1cdbd2cSJim Jagielski 		uno::Reference<XAccessibleComponent> xAccessibleComponent(getAccessibleParent()->getAccessibleContext(), uno::UNO_QUERY);
223*b1cdbd2cSJim Jagielski 		if (xAccessibleComponent.is())
224*b1cdbd2cSJim Jagielski 			xAccessibleComponent->grabFocus();
225*b1cdbd2cSJim Jagielski 	}
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski //=====  XAccessibleContext  ==============================================
229*b1cdbd2cSJim Jagielski 
getAccessibleChildCount()230*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePageHeader::getAccessibleChildCount() throw (uno::RuntimeException)
231*b1cdbd2cSJim Jagielski {
232*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
233*b1cdbd2cSJim Jagielski     IsObjectValid();
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski     if((mnChildCount < 0) && mpViewShell)
236*b1cdbd2cSJim Jagielski     {
237*b1cdbd2cSJim Jagielski         mnChildCount = 0;
238*b1cdbd2cSJim Jagielski         ScDocument* pDoc = mpViewShell->GetDocument();
239*b1cdbd2cSJim Jagielski         if (pDoc)
240*b1cdbd2cSJim Jagielski         {
241*b1cdbd2cSJim Jagielski         	// find out how many regions (left,center, right) are with content
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski             SfxStyleSheetBase* pStyle = pDoc->GetStyleSheetPool()->Find(pDoc->GetPageStyle(mpViewShell->GetLocationData().GetPrintTab()), SFX_STYLE_FAMILY_PAGE);
244*b1cdbd2cSJim Jagielski             if (pStyle)
245*b1cdbd2cSJim Jagielski             {
246*b1cdbd2cSJim Jagielski                 sal_uInt16 nPageWhichId(0);
247*b1cdbd2cSJim Jagielski                 if (mbHeader)
248*b1cdbd2cSJim Jagielski                     nPageWhichId = mpViewShell->GetLocationData().IsHeaderLeft() ? ATTR_PAGE_HEADERLEFT : ATTR_PAGE_HEADERRIGHT;
249*b1cdbd2cSJim Jagielski                 else
250*b1cdbd2cSJim Jagielski                     nPageWhichId = mpViewShell->GetLocationData().IsFooterLeft() ? ATTR_PAGE_FOOTERLEFT : ATTR_PAGE_FOOTERRIGHT;
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 			    const ScPageHFItem& rPageItem = static_cast<const ScPageHFItem&>(pStyle->GetItemSet().Get(nPageWhichId));
253*b1cdbd2cSJim Jagielski 				AddChild(rPageItem.GetLeftArea(), 0, SVX_ADJUST_LEFT);
254*b1cdbd2cSJim Jagielski 				AddChild(rPageItem.GetCenterArea(), 1, SVX_ADJUST_CENTER);
255*b1cdbd2cSJim Jagielski 				AddChild(rPageItem.GetRightArea(), 2, SVX_ADJUST_RIGHT);
256*b1cdbd2cSJim Jagielski             }
257*b1cdbd2cSJim Jagielski         }
258*b1cdbd2cSJim Jagielski     }
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 	return mnChildCount;
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski 
getAccessibleChild(sal_Int32 nIndex)263*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessiblePageHeader::getAccessibleChild( sal_Int32 nIndex )
264*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
265*b1cdbd2cSJim Jagielski {
266*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
267*b1cdbd2cSJim Jagielski     IsObjectValid();
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 	uno::Reference<XAccessible> xRet;
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski     if(mnChildCount < 0)
272*b1cdbd2cSJim Jagielski         getAccessibleChildCount();
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski     ScHFAreas::iterator aItr = maAreas.begin();
275*b1cdbd2cSJim Jagielski     ScHFAreas::iterator aEndItr = maAreas.end();
276*b1cdbd2cSJim Jagielski     while (!xRet.is() && (nIndex >= 0) && (aItr != aEndItr))
277*b1cdbd2cSJim Jagielski     {
278*b1cdbd2cSJim Jagielski         if (*aItr)
279*b1cdbd2cSJim Jagielski         {
280*b1cdbd2cSJim Jagielski             if (nIndex == 0)
281*b1cdbd2cSJim Jagielski                 xRet = *aItr;
282*b1cdbd2cSJim Jagielski             else
283*b1cdbd2cSJim Jagielski                 --nIndex;
284*b1cdbd2cSJim Jagielski         }
285*b1cdbd2cSJim Jagielski         else
286*b1cdbd2cSJim Jagielski             ++aItr;
287*b1cdbd2cSJim Jagielski     }
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski 	if ( !xRet.is() )
290*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 	return xRet;
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
getAccessibleIndexInParent()295*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePageHeader::getAccessibleIndexInParent() throw (uno::RuntimeException)
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski 	return mnIndex;
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski 
getAccessibleStateSet()300*b1cdbd2cSJim Jagielski uno::Reference< XAccessibleStateSet > SAL_CALL ScAccessiblePageHeader::getAccessibleStateSet()
301*b1cdbd2cSJim Jagielski 								throw (uno::RuntimeException)
302*b1cdbd2cSJim Jagielski {
303*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
304*b1cdbd2cSJim Jagielski 	uno::Reference<XAccessibleStateSet> xParentStates;
305*b1cdbd2cSJim Jagielski 	if (getAccessibleParent().is())
306*b1cdbd2cSJim Jagielski 	{
307*b1cdbd2cSJim Jagielski 		uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
308*b1cdbd2cSJim Jagielski 		xParentStates = xParentContext->getAccessibleStateSet();
309*b1cdbd2cSJim Jagielski 	}
310*b1cdbd2cSJim Jagielski 	utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
311*b1cdbd2cSJim Jagielski 	if (IsDefunc(xParentStates))
312*b1cdbd2cSJim Jagielski 		pStateSet->AddState(AccessibleStateType::DEFUNC);
313*b1cdbd2cSJim Jagielski     else
314*b1cdbd2cSJim Jagielski     {
315*b1cdbd2cSJim Jagielski 	    pStateSet->AddState(AccessibleStateType::ENABLED);
316*b1cdbd2cSJim Jagielski 	    pStateSet->AddState(AccessibleStateType::OPAQUE);
317*b1cdbd2cSJim Jagielski 	    if (isShowing())
318*b1cdbd2cSJim Jagielski 		    pStateSet->AddState(AccessibleStateType::SHOWING);
319*b1cdbd2cSJim Jagielski 	    if (isVisible())
320*b1cdbd2cSJim Jagielski 		    pStateSet->AddState(AccessibleStateType::VISIBLE);
321*b1cdbd2cSJim Jagielski     }
322*b1cdbd2cSJim Jagielski 	return pStateSet;
323*b1cdbd2cSJim Jagielski }
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski //=====  XServiceInfo  ====================================================
326*b1cdbd2cSJim Jagielski 
getImplementationName()327*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL ScAccessiblePageHeader::getImplementationName() throw(uno::RuntimeException)
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski 	return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ScAccessiblePageHeader"));
330*b1cdbd2cSJim Jagielski }
331*b1cdbd2cSJim Jagielski 
getSupportedServiceNames()332*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString> SAL_CALL ScAccessiblePageHeader::getSupportedServiceNames()
333*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
334*b1cdbd2cSJim Jagielski {
335*b1cdbd2cSJim Jagielski 	uno::Sequence< ::rtl::OUString > aSequence = ScAccessibleContextBase::getSupportedServiceNames();
336*b1cdbd2cSJim Jagielski     sal_Int32 nOldSize(aSequence.getLength());
337*b1cdbd2cSJim Jagielski     aSequence.realloc(nOldSize + 1);
338*b1cdbd2cSJim Jagielski     ::rtl::OUString* pNames = aSequence.getArray();
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 	pNames[nOldSize] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.AccessibleHeaderFooterView"));
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 	return aSequence;
343*b1cdbd2cSJim Jagielski }
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski //====  internal  =========================================================
346*b1cdbd2cSJim Jagielski 
createAccessibleDescription(void)347*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessiblePageHeader::createAccessibleDescription(void)
348*b1cdbd2cSJim Jagielski 				    throw (uno::RuntimeException)
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski     String sDesc(ScResId(mbHeader ? STR_ACC_HEADER_DESCR : STR_ACC_FOOTER_DESCR));
351*b1cdbd2cSJim Jagielski     sDesc.SearchAndReplaceAscii("%1", String(ScResId(SCSTR_UNKNOWN)));
352*b1cdbd2cSJim Jagielski 	return rtl::OUString( sDesc );
353*b1cdbd2cSJim Jagielski }
354*b1cdbd2cSJim Jagielski 
createAccessibleName(void)355*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessiblePageHeader::createAccessibleName(void)
356*b1cdbd2cSJim Jagielski 				    throw (uno::RuntimeException)
357*b1cdbd2cSJim Jagielski {
358*b1cdbd2cSJim Jagielski     String sName(ScResId(mbHeader ? STR_ACC_HEADER_NAME : STR_ACC_FOOTER_NAME));
359*b1cdbd2cSJim Jagielski     sName.SearchAndReplaceAscii("%1", String(ScResId(SCSTR_UNKNOWN)));
360*b1cdbd2cSJim Jagielski 	return rtl::OUString( sName );
361*b1cdbd2cSJim Jagielski }
362*b1cdbd2cSJim Jagielski 
GetBoundingBoxOnScreen() const363*b1cdbd2cSJim Jagielski Rectangle ScAccessiblePageHeader::GetBoundingBoxOnScreen() const throw (uno::RuntimeException)
364*b1cdbd2cSJim Jagielski {
365*b1cdbd2cSJim Jagielski 	Rectangle aCellRect(GetBoundingBox());
366*b1cdbd2cSJim Jagielski 	if (mpViewShell)
367*b1cdbd2cSJim Jagielski 	{
368*b1cdbd2cSJim Jagielski 		Window* pWindow = mpViewShell->GetWindow();
369*b1cdbd2cSJim Jagielski 		if (pWindow)
370*b1cdbd2cSJim Jagielski 		{
371*b1cdbd2cSJim Jagielski 			Rectangle aRect = pWindow->GetWindowExtentsRelative(NULL);
372*b1cdbd2cSJim Jagielski 			aCellRect.setX(aCellRect.getX() + aRect.getX());
373*b1cdbd2cSJim Jagielski 			aCellRect.setY(aCellRect.getY() + aRect.getY());
374*b1cdbd2cSJim Jagielski 		}
375*b1cdbd2cSJim Jagielski 	}
376*b1cdbd2cSJim Jagielski 	return aCellRect;
377*b1cdbd2cSJim Jagielski }
378*b1cdbd2cSJim Jagielski 
GetBoundingBox() const379*b1cdbd2cSJim Jagielski Rectangle ScAccessiblePageHeader::GetBoundingBox() const throw (uno::RuntimeException)
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski 	Rectangle aRect;
382*b1cdbd2cSJim Jagielski 	if (mpViewShell)
383*b1cdbd2cSJim Jagielski 	{
384*b1cdbd2cSJim Jagielski 		const ScPreviewLocationData& rData = mpViewShell->GetLocationData();
385*b1cdbd2cSJim Jagielski 		if ( mbHeader )
386*b1cdbd2cSJim Jagielski 			rData.GetHeaderPosition( aRect );
387*b1cdbd2cSJim Jagielski 		else
388*b1cdbd2cSJim Jagielski 			rData.GetFooterPosition( aRect );
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski         // the Rectangle could contain negative coordinates so it should be cliped
391*b1cdbd2cSJim Jagielski         Rectangle aClipRect(Point(0, 0), aRect.GetSize());
392*b1cdbd2cSJim Jagielski 		Window* pWindow = mpViewShell->GetWindow();
393*b1cdbd2cSJim Jagielski 		if (pWindow)
394*b1cdbd2cSJim Jagielski 			aClipRect = pWindow->GetWindowExtentsRelative(pWindow->GetAccessibleParentWindow());
395*b1cdbd2cSJim Jagielski         aRect = aClipRect.GetIntersection(aRect);
396*b1cdbd2cSJim Jagielski     }
397*b1cdbd2cSJim Jagielski     if (aRect.IsEmpty())
398*b1cdbd2cSJim Jagielski         aRect.SetSize(Size(-1, -1));
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 	return aRect;
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
IsDefunc(const uno::Reference<XAccessibleStateSet> & rxParentStates)403*b1cdbd2cSJim Jagielski sal_Bool ScAccessiblePageHeader::IsDefunc( const uno::Reference<XAccessibleStateSet>& rxParentStates )
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski 	return ScAccessibleContextBase::IsDefunc() || (mpViewShell == NULL) || !getAccessibleParent().is() ||
406*b1cdbd2cSJim Jagielski 		(rxParentStates.is() && rxParentStates->contains(AccessibleStateType::DEFUNC));
407*b1cdbd2cSJim Jagielski }
408*b1cdbd2cSJim Jagielski 
AddChild(const EditTextObject * pArea,sal_uInt32 nIndex,SvxAdjust eAdjust)409*b1cdbd2cSJim Jagielski void ScAccessiblePageHeader::AddChild(const EditTextObject* pArea, sal_uInt32 nIndex, SvxAdjust eAdjust)
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski     if (pArea && (pArea->GetText(0).Len() || (pArea->GetParagraphCount() > 1)))
412*b1cdbd2cSJim Jagielski     {
413*b1cdbd2cSJim Jagielski         if (maAreas[nIndex])
414*b1cdbd2cSJim Jagielski         {
415*b1cdbd2cSJim Jagielski             if (!ScGlobal::EETextObjEqual(maAreas[nIndex]->GetEditTextObject(), pArea))
416*b1cdbd2cSJim Jagielski             {
417*b1cdbd2cSJim Jagielski                 maAreas[nIndex]->release();
418*b1cdbd2cSJim Jagielski                 maAreas[nIndex] = new ScAccessiblePageHeaderArea(this, mpViewShell, pArea, mbHeader, eAdjust);
419*b1cdbd2cSJim Jagielski                 maAreas[nIndex]->acquire();
420*b1cdbd2cSJim Jagielski             }
421*b1cdbd2cSJim Jagielski         }
422*b1cdbd2cSJim Jagielski         else
423*b1cdbd2cSJim Jagielski         {
424*b1cdbd2cSJim Jagielski             maAreas[nIndex] = new ScAccessiblePageHeaderArea(this, mpViewShell, pArea, mbHeader, eAdjust);
425*b1cdbd2cSJim Jagielski             maAreas[nIndex]->acquire();
426*b1cdbd2cSJim Jagielski         }
427*b1cdbd2cSJim Jagielski         ++mnChildCount;
428*b1cdbd2cSJim Jagielski     }
429*b1cdbd2cSJim Jagielski     else
430*b1cdbd2cSJim Jagielski     {
431*b1cdbd2cSJim Jagielski         if (maAreas[nIndex])
432*b1cdbd2cSJim Jagielski         {
433*b1cdbd2cSJim Jagielski             maAreas[nIndex]->release();
434*b1cdbd2cSJim Jagielski             maAreas[nIndex] = NULL;
435*b1cdbd2cSJim Jagielski         }
436*b1cdbd2cSJim Jagielski     }
437*b1cdbd2cSJim Jagielski }
438