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