Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <accfrmobj.hxx>
21 :
22 : #include <accmap.hxx>
23 : #include <acccontext.hxx>
24 :
25 : #include <viewsh.hxx>
26 : #include <rootfrm.hxx>
27 : #include <flyfrm.hxx>
28 : #include <pagefrm.hxx>
29 : #include <cellfrm.hxx>
30 : #include <swtable.hxx>
31 : #include <dflyobj.hxx>
32 : #include <frmfmt.hxx>
33 : #include <fmtanchr.hxx>
34 : #include <dcontact.hxx>
35 :
36 : #include <pam.hxx>
37 :
38 : #include <vcl/window.hxx>
39 :
40 : namespace sw { namespace access {
41 :
42 3220 : SwAccessibleChild::SwAccessibleChild()
43 : : mpFrm( 0 )
44 : , mpDrawObj( 0 )
45 3220 : , mpWindow( 0 )
46 3220 : {}
47 :
48 0 : SwAccessibleChild::SwAccessibleChild( const SdrObject* pDrawObj )
49 : : mpFrm( 0 )
50 : , mpDrawObj( 0 )
51 0 : , mpWindow( 0 )
52 : {
53 0 : Init( pDrawObj );
54 0 : }
55 :
56 12463 : SwAccessibleChild::SwAccessibleChild( const SwFrm* pFrm )
57 : : mpFrm( 0 )
58 : , mpDrawObj( 0 )
59 12463 : , mpWindow( 0 )
60 : {
61 12463 : Init( pFrm );
62 12463 : }
63 :
64 205 : SwAccessibleChild::SwAccessibleChild( vcl::Window* pWindow )
65 : : mpFrm( 0 )
66 : , mpDrawObj( 0 )
67 205 : , mpWindow( 0 )
68 : {
69 205 : Init( pWindow );
70 205 : }
71 :
72 154 : SwAccessibleChild::SwAccessibleChild( const SwFrm* pFrm,
73 : const SdrObject* pDrawObj,
74 : vcl::Window* pWindow )
75 : : mpFrm( 0 )
76 : , mpDrawObj( 0 )
77 154 : , mpWindow( 0 )
78 : {
79 154 : if ( pFrm )
80 : {
81 154 : Init( pFrm );
82 : }
83 0 : else if ( pDrawObj )
84 : {
85 0 : Init( pDrawObj );
86 : }
87 0 : else if ( pWindow )
88 : {
89 0 : Init( pWindow );
90 : }
91 : OSL_ENSURE( (!pFrm || pFrm == mpFrm) &&
92 : (!pDrawObj || pDrawObj == mpDrawObj) &&
93 : (!pWindow || pWindow == mpWindow),
94 : "invalid frame/object/window combination" );
95 :
96 154 : }
97 :
98 292 : void SwAccessibleChild::Init( const SdrObject* pDrawObj )
99 : {
100 292 : mpDrawObj = pDrawObj;
101 52 : mpFrm = mpDrawObj && mpDrawObj->ISA(SwVirtFlyDrawObj)
102 52 : ? static_cast < const SwVirtFlyDrawObj * >( mpDrawObj )->GetFlyFrm()
103 344 : : 0;
104 292 : mpWindow = 0;
105 292 : }
106 :
107 19913 : void SwAccessibleChild::Init( const SwFrm* pFrm )
108 : {
109 19913 : mpFrm = pFrm;
110 18449 : mpDrawObj = mpFrm && mpFrm->IsFlyFrm()
111 46 : ? static_cast < const SwFlyFrm * >( mpFrm )->GetVirtDrawObj()
112 19959 : : 0;
113 19913 : mpWindow = 0;
114 19913 : }
115 :
116 205 : void SwAccessibleChild::Init( vcl::Window* pWindow )
117 : {
118 205 : mpWindow = pWindow;
119 205 : mpFrm = 0;
120 205 : mpDrawObj = 0;
121 205 : }
122 :
123 10266 : bool SwAccessibleChild::IsAccessible( bool bPagePreview ) const
124 : {
125 10266 : bool bRet( false );
126 :
127 10266 : if ( mpFrm )
128 : {
129 17136 : bRet = mpFrm->IsAccessibleFrm() &&
130 7424 : ( !mpFrm->IsCellFrm() ||
131 7424 : static_cast<const SwCellFrm *>( mpFrm )->GetTabBox()->GetSttNd() != 0 ) &&
132 28182 : !mpFrm->IsInCoveredCell() &&
133 6870 : ( bPagePreview ||
134 17136 : !mpFrm->IsPageFrm() );
135 : }
136 0 : else if ( mpDrawObj )
137 : {
138 0 : bRet = true;
139 : }
140 0 : else if ( mpWindow )
141 : {
142 0 : bRet = true;
143 : }
144 :
145 10266 : return bRet;
146 : }
147 :
148 776 : bool SwAccessibleChild::IsBoundAsChar() const
149 : {
150 776 : bool bRet( false );
151 :
152 776 : if ( mpFrm )
153 : {
154 816 : bRet = mpFrm->IsFlyFrm() &&
155 816 : static_cast< const SwFlyFrm *>(mpFrm)->IsFlyInCntFrm();
156 : }
157 0 : else if ( mpDrawObj )
158 : {
159 0 : const SwFrmFmt* mpFrmFmt = ::FindFrmFmt( mpDrawObj );
160 : bRet = mpFrmFmt
161 0 : ? (FLY_AS_CHAR == mpFrmFmt->GetAnchor().GetAnchorId())
162 0 : : false;
163 : }
164 0 : else if ( mpWindow )
165 : {
166 0 : bRet = false;
167 : }
168 :
169 776 : return bRet;
170 : }
171 :
172 408 : SwAccessibleChild::SwAccessibleChild( const SwAccessibleChild& r )
173 : : mpFrm( r.mpFrm )
174 : , mpDrawObj( r.mpDrawObj )
175 408 : , mpWindow( r.mpWindow )
176 408 : {}
177 :
178 425 : SwAccessibleChild& SwAccessibleChild::operator=( const SwAccessibleChild& r )
179 : {
180 425 : mpDrawObj = r.mpDrawObj;
181 425 : mpFrm = r.mpFrm;
182 425 : mpWindow = r.mpWindow;
183 :
184 425 : return *this;
185 : }
186 :
187 292 : SwAccessibleChild& SwAccessibleChild::operator=( const SdrObject* pDrawObj )
188 : {
189 292 : Init( pDrawObj );
190 292 : return *this;
191 : }
192 :
193 7296 : SwAccessibleChild& SwAccessibleChild::operator=( const SwFrm* pFrm )
194 : {
195 7296 : Init( pFrm );
196 7296 : return *this;
197 : }
198 :
199 0 : SwAccessibleChild& SwAccessibleChild::operator=( vcl::Window* pWindow )
200 : {
201 0 : Init( pWindow );
202 0 : return *this;
203 : }
204 :
205 3252 : bool SwAccessibleChild::operator==( const SwAccessibleChild& r ) const
206 : {
207 4726 : return mpFrm == r.mpFrm &&
208 4726 : mpDrawObj == r.mpDrawObj &&
209 4726 : mpWindow == r.mpWindow;
210 : }
211 :
212 1914 : bool SwAccessibleChild::IsValid() const
213 : {
214 3068 : return mpFrm != 0 ||
215 3068 : mpDrawObj != 0 ||
216 3068 : mpWindow != 0;
217 : }
218 :
219 1410 : bool SwAccessibleChild::IsVisibleChildrenOnly() const
220 : {
221 1410 : bool bRet( false );
222 :
223 1410 : if ( !mpFrm )
224 : {
225 0 : bRet = true;
226 : }
227 : else
228 : {
229 3574 : bRet = mpFrm->IsRootFrm() ||
230 2330 : !( mpFrm->IsTabFrm() ||
231 1122 : mpFrm->IsInTab() ||
232 754 : ( IsBoundAsChar() &&
233 2164 : static_cast<const SwFlyFrm*>(mpFrm)->GetAnchorFrm()->IsInTab() ) );
234 : }
235 :
236 1410 : return bRet;
237 : }
238 :
239 1344 : SwRect SwAccessibleChild::GetBox( const SwAccessibleMap& rAccMap ) const
240 : {
241 1344 : SwRect aBox;
242 :
243 1344 : if ( mpFrm )
244 : {
245 1568 : if ( mpFrm->IsPageFrm() &&
246 224 : static_cast< const SwPageFrm * >( mpFrm )->IsEmptyPage() )
247 : {
248 0 : aBox = SwRect( mpFrm->Frm().Left(), mpFrm->Frm().Top()-1, 1, 1 );
249 : }
250 1344 : else if ( mpFrm->IsTabFrm() )
251 : {
252 60 : aBox = SwRect( mpFrm->Frm() );
253 60 : aBox.Intersection( mpFrm->GetUpper()->Frm() );
254 : }
255 : else
256 : {
257 1284 : aBox = mpFrm->Frm();
258 : }
259 : }
260 0 : else if( mpDrawObj )
261 : {
262 0 : aBox = SwRect( mpDrawObj->GetCurrentBoundRect() );
263 : }
264 0 : else if ( mpWindow )
265 : {
266 0 : aBox = SwRect( rAccMap.GetShell()->GetWin()->PixelToLogic(
267 0 : Rectangle( mpWindow->GetPosPixel(),
268 0 : mpWindow->GetSizePixel() ) ) );
269 : }
270 :
271 1344 : return aBox;
272 : }
273 :
274 3094 : SwRect SwAccessibleChild::GetBounds( const SwAccessibleMap& rAccMap ) const
275 : {
276 3094 : SwRect aBound;
277 :
278 3094 : if( mpFrm )
279 : {
280 3094 : if( mpFrm->IsPageFrm() &&
281 0 : static_cast< const SwPageFrm * >( mpFrm )->IsEmptyPage() )
282 : {
283 0 : aBound = SwRect( mpFrm->Frm().Left(), mpFrm->Frm().Top()-1, 0, 0 );
284 : }
285 : else
286 3094 : aBound = mpFrm->PaintArea();
287 : }
288 0 : else if( mpDrawObj )
289 : {
290 0 : aBound = GetBox( rAccMap );
291 : }
292 0 : else if ( mpWindow )
293 : {
294 0 : aBound = GetBox( rAccMap );
295 : }
296 :
297 3094 : return aBound;
298 : }
299 :
300 664 : bool SwAccessibleChild::AlwaysIncludeAsChild() const
301 : {
302 664 : bool bAlwaysIncludedAsChild( false );
303 :
304 664 : if ( mpWindow )
305 : {
306 0 : bAlwaysIncludedAsChild = true;
307 : }
308 :
309 664 : return bAlwaysIncludedAsChild;
310 : }
311 :
312 2892 : const SwFrm* SwAccessibleChild::GetParent( const bool bInPagePreview ) const
313 : {
314 2892 : const SwFrm* pParent( 0 );
315 :
316 2892 : if ( mpFrm )
317 : {
318 2892 : if( mpFrm->IsFlyFrm() )
319 : {
320 0 : const SwFlyFrm* pFly = static_cast< const SwFlyFrm *>( mpFrm );
321 0 : if( pFly->IsFlyInCntFrm() )
322 : {
323 : // For FLY_AS_CHAR the parent is the anchor
324 0 : pParent = pFly->GetAnchorFrm();
325 : OSL_ENSURE( SwAccessibleChild( pParent ).IsAccessible( bInPagePreview ),
326 : "parent is not accessible" );
327 : }
328 : else
329 : {
330 : // In any other case the parent is the root frm
331 : // (in page preview, the page frame)
332 0 : if( bInPagePreview )
333 0 : pParent = pFly->FindPageFrm();
334 : else
335 0 : pParent = pFly->getRootFrm();
336 : }
337 : }
338 : else
339 : {
340 2892 : SwAccessibleChild aUpper( mpFrm->GetUpper() );
341 10996 : while( aUpper.GetSwFrm() && !aUpper.IsAccessible(bInPagePreview) )
342 : {
343 5212 : aUpper = aUpper.GetSwFrm()->GetUpper();
344 : }
345 2892 : pParent = aUpper.GetSwFrm();
346 : }
347 : }
348 0 : else if( mpDrawObj )
349 : {
350 : const SwDrawContact *pContact =
351 0 : static_cast< const SwDrawContact* >( GetUserCall( mpDrawObj ) );
352 : OSL_ENSURE( pContact, "sdr contact is missing" );
353 0 : if( pContact )
354 : {
355 0 : const SwFrmFmt *pFrmFmt = pContact->GetFmt();
356 : OSL_ENSURE( pFrmFmt, "frame format is missing" );
357 0 : if( pFrmFmt && FLY_AS_CHAR == pFrmFmt->GetAnchor().GetAnchorId() )
358 : {
359 : // For FLY_AS_CHAR the parent is the anchor
360 0 : pParent = pContact->GetAnchorFrm();
361 : OSL_ENSURE( SwAccessibleChild( pParent ).IsAccessible( bInPagePreview ),
362 : "parent is not accessible" );
363 :
364 : }
365 : else
366 : {
367 : // In any other case the parent is the root frm
368 0 : if( bInPagePreview )
369 0 : pParent = pContact->GetAnchorFrm()->FindPageFrm();
370 : else
371 0 : pParent = pContact->GetAnchorFrm()->getRootFrm();
372 : }
373 : }
374 : }
375 0 : else if ( mpWindow )
376 : {
377 : css::uno::Reference < css::accessibility::XAccessible > xAcc =
378 0 : mpWindow->GetAccessible();
379 0 : if ( xAcc.is() )
380 : {
381 : css::uno::Reference < css::accessibility::XAccessibleContext > xAccContext =
382 0 : xAcc->getAccessibleContext();
383 0 : if ( xAccContext.is() )
384 : {
385 : css::uno::Reference < css::accessibility::XAccessible > xAccParent =
386 0 : xAccContext->getAccessibleParent();
387 0 : if ( xAccParent.is() )
388 : {
389 : SwAccessibleContext* pAccParentImpl =
390 0 : dynamic_cast< SwAccessibleContext *>( xAccParent.get() );
391 0 : if ( pAccParentImpl )
392 : {
393 0 : pParent = pAccParentImpl->GetFrm();
394 : }
395 0 : }
396 0 : }
397 0 : }
398 : }
399 :
400 2892 : return pParent;
401 : }
402 :
403 270 : } } // eof of namespace sw::access
404 :
405 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|