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 <vcl/window.hxx>
21 : #include <rootfrm.hxx>
22 :
23 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
24 : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
25 : #include <com/sun/star/beans/XPropertyChangeListener.hpp>
26 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
27 : #include <unotools/accessiblestatesethelper.hxx>
28 : #include <sfx2/viewsh.hxx>
29 : #include <osl/mutex.hxx>
30 : #include <vcl/svapp.hxx>
31 : #include <comphelper/servicehelper.hxx>
32 : #include <cppuhelper/supportsservice.hxx>
33 : #include <viewsh.hxx>
34 : #include <doc.hxx>
35 : #include <accmap.hxx>
36 : #include <accdoc.hxx>
37 : #include "access.hrc"
38 : #include <pagefrm.hxx>
39 :
40 : #include <editeng/brushitem.hxx>
41 : #include <swatrset.hxx>
42 : #include <frmatr.hxx>
43 : #include "unostyle.hxx"
44 : #include "docsh.hxx"
45 : #include <crsrsh.hxx>
46 : #include "fesh.hxx"
47 : #include <fmtclds.hxx>
48 : #include <flyfrm.hxx>
49 : #include <colfrm.hxx>
50 : #include <txtfrm.hxx>
51 : #include <sectfrm.hxx>
52 : #include <section.hxx>
53 : #include <svx/unoapi.hxx>
54 : #include <swmodule.hxx>
55 : #include <svtools/colorcfg.hxx>
56 :
57 : #include <fmtanchr.hxx>
58 : #include <viewimp.hxx>
59 : #include <dview.hxx>
60 : #include <dcontact.hxx>
61 : #include <svx/svdmark.hxx>
62 : const sal_Char sServiceName[] = "com.sun.star.text.AccessibleTextDocumentView";
63 : const sal_Char sImplementationName[] = "com.sun.star.comp.Writer.SwAccessibleDocumentView";
64 :
65 : using namespace ::com::sun::star;
66 : using namespace ::com::sun::star::accessibility;
67 :
68 : using lang::IndexOutOfBoundsException;
69 :
70 : // SwAccessibleDocumentBase: base class for SwAccessibleDocument and
71 : // SwAccessiblePreview
72 :
73 12 : SwAccessibleDocumentBase::SwAccessibleDocumentBase ( SwAccessibleMap *_pMap ) :
74 : SwAccessibleContext( _pMap, AccessibleRole::DOCUMENT_TEXT,
75 12 : _pMap->GetShell()->GetLayout() ),
76 : mxParent( _pMap->GetShell()->GetWin()->GetAccessibleParentWindow()->GetAccessible() ),
77 12 : mpChildWin( 0 )
78 : {
79 12 : }
80 :
81 12 : SwAccessibleDocumentBase::~SwAccessibleDocumentBase()
82 : {
83 12 : }
84 :
85 25 : void SwAccessibleDocumentBase::SetVisArea()
86 : {
87 25 : SolarMutexGuard aGuard;
88 :
89 25 : SwRect aOldVisArea( GetVisArea() );
90 25 : const SwRect& rNewVisArea = GetMap()->GetVisArea();
91 25 : if( aOldVisArea != rNewVisArea )
92 : {
93 25 : SwAccessibleFrame::SetVisArea( GetMap()->GetVisArea() );
94 : // #i58139# - showing state of document view needs also be updated.
95 : // Thus, call method <Scrolled(..)> instead of <ChildrenScrolled(..)>
96 : // ChildrenScrolled( GetFrm(), aOldVisArea );
97 25 : Scrolled( aOldVisArea );
98 25 : }
99 25 : }
100 :
101 0 : void SwAccessibleDocumentBase::AddChild( vcl::Window *pWin, bool bFireEvent )
102 : {
103 0 : SolarMutexGuard aGuard;
104 :
105 : OSL_ENSURE( !mpChildWin, "only one child window is supported" );
106 0 : if( !mpChildWin )
107 : {
108 0 : mpChildWin = pWin;
109 :
110 0 : if( bFireEvent )
111 : {
112 0 : AccessibleEventObject aEvent;
113 0 : aEvent.EventId = AccessibleEventId::CHILD;
114 0 : aEvent.NewValue <<= mpChildWin->GetAccessible();
115 0 : FireAccessibleEvent( aEvent );
116 : }
117 0 : }
118 0 : }
119 :
120 0 : void SwAccessibleDocumentBase::RemoveChild( vcl::Window *pWin )
121 : {
122 0 : SolarMutexGuard aGuard;
123 :
124 : OSL_ENSURE( !mpChildWin || pWin == mpChildWin, "invalid child window to remove" );
125 0 : if( mpChildWin && pWin == mpChildWin )
126 : {
127 0 : AccessibleEventObject aEvent;
128 0 : aEvent.EventId = AccessibleEventId::CHILD;
129 0 : aEvent.OldValue <<= mpChildWin->GetAccessible();
130 0 : FireAccessibleEvent( aEvent );
131 :
132 0 : mpChildWin = 0;
133 0 : }
134 0 : }
135 :
136 34 : sal_Int32 SAL_CALL SwAccessibleDocumentBase::getAccessibleChildCount()
137 : throw (uno::RuntimeException, std::exception)
138 : {
139 34 : SolarMutexGuard aGuard;
140 :
141 : // CHECK_FOR_DEFUNC is called by parent
142 :
143 34 : sal_Int32 nChildren = SwAccessibleContext::getAccessibleChildCount();
144 34 : if( !IsDisposing() && mpChildWin )
145 0 : nChildren++;
146 :
147 34 : return nChildren;
148 : }
149 :
150 : uno::Reference< XAccessible> SAL_CALL
151 20 : SwAccessibleDocumentBase::getAccessibleChild( sal_Int32 nIndex )
152 : throw (uno::RuntimeException,
153 : lang::IndexOutOfBoundsException, std::exception)
154 : {
155 20 : SolarMutexGuard aGuard;
156 :
157 20 : if( mpChildWin )
158 : {
159 0 : CHECK_FOR_DEFUNC( XAccessibleContext )
160 0 : if ( nIndex == GetChildCount( *(GetMap()) ) )
161 : {
162 0 : return mpChildWin->GetAccessible();
163 : }
164 : }
165 :
166 20 : return SwAccessibleContext::getAccessibleChild( nIndex );
167 : }
168 :
169 14 : uno::Reference< XAccessible> SAL_CALL SwAccessibleDocumentBase::getAccessibleParent()
170 : throw (uno::RuntimeException, std::exception)
171 : {
172 14 : return mxParent;
173 : }
174 :
175 0 : sal_Int32 SAL_CALL SwAccessibleDocumentBase::getAccessibleIndexInParent()
176 : throw (uno::RuntimeException, std::exception)
177 : {
178 0 : SolarMutexGuard aGuard;
179 :
180 0 : uno::Reference < XAccessibleContext > xAcc( mxParent->getAccessibleContext() );
181 0 : uno::Reference < XAccessible > xThis( this );
182 0 : sal_Int32 nCount = xAcc->getAccessibleChildCount();
183 :
184 0 : for( sal_Int32 i=0; i < nCount; i++ )
185 : {
186 : try
187 : {
188 0 : if( xAcc->getAccessibleChild( i ) == xThis )
189 0 : return i;
190 : }
191 0 : catch(const ::com::sun::star::lang::IndexOutOfBoundsException &)
192 : {
193 0 : return -1L;
194 : }
195 : }
196 0 : return -1L;
197 : }
198 :
199 14 : OUString SAL_CALL SwAccessibleDocumentBase::getAccessibleDescription()
200 : throw (uno::RuntimeException, std::exception)
201 : {
202 14 : return GetResource( STR_ACCESS_DOC_DESC );
203 : }
204 :
205 14 : OUString SAL_CALL SwAccessibleDocumentBase::getAccessibleName()
206 : throw (::com::sun::star::uno::RuntimeException, std::exception)
207 : {
208 14 : SolarMutexGuard g;
209 :
210 14 : OUString sAccName = GetResource( STR_ACCESS_DOC_WORDPROCESSING );
211 14 : SwDoc *pDoc = GetMap() ? GetShell()->GetDoc() : 0;
212 14 : if ( pDoc )
213 : {
214 14 : OUString sFileName = pDoc->getDocAccTitle();
215 14 : if ( sFileName.isEmpty() )
216 : {
217 14 : SwDocShell* pDocSh = pDoc->GetDocShell();
218 14 : if ( pDocSh )
219 : {
220 14 : sFileName = pDocSh->GetTitle( SFX_TITLE_APINAME );
221 : }
222 : }
223 28 : OUString sReadOnly;
224 14 : if(pDoc->getDocReadOnly())
225 : {
226 0 : sReadOnly = GetResource( STR_ACCESS_DOC_WORDPROCESSING_READONLY );
227 : }
228 :
229 14 : if ( !sFileName.isEmpty() )
230 : {
231 14 : sAccName = sFileName + sReadOnly + " - " + sAccName;
232 14 : }
233 : }
234 :
235 14 : return sAccName;
236 : }
237 :
238 0 : awt::Rectangle SAL_CALL SwAccessibleDocumentBase::getBounds()
239 : throw (uno::RuntimeException, std::exception)
240 : {
241 : try
242 : {
243 0 : SolarMutexGuard aGuard;
244 :
245 0 : vcl::Window *pWin = GetWindow();
246 :
247 0 : CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
248 :
249 0 : Rectangle aPixBounds( pWin->GetWindowExtentsRelative( pWin->GetAccessibleParentWindow() ) );
250 0 : awt::Rectangle aBox( aPixBounds.Left(), aPixBounds.Top(),
251 0 : aPixBounds.GetWidth(), aPixBounds.GetHeight() );
252 :
253 0 : return aBox;
254 : }
255 0 : catch(const ::com::sun::star::lang::IndexOutOfBoundsException &)
256 : {
257 0 : return awt::Rectangle();
258 : }
259 : }
260 :
261 0 : awt::Point SAL_CALL SwAccessibleDocumentBase::getLocation()
262 : throw (uno::RuntimeException, std::exception)
263 : {
264 0 : SolarMutexGuard aGuard;
265 :
266 0 : vcl::Window *pWin = GetWindow();
267 :
268 0 : CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
269 :
270 0 : Point aPixPos( pWin->GetWindowExtentsRelative( pWin->GetAccessibleParentWindow() ).TopLeft() );
271 0 : awt::Point aLoc( aPixPos.getX(), aPixPos.getY() );
272 :
273 0 : return aLoc;
274 : }
275 :
276 2 : ::com::sun::star::awt::Point SAL_CALL SwAccessibleDocumentBase::getLocationOnScreen()
277 : throw (uno::RuntimeException, std::exception)
278 : {
279 2 : SolarMutexGuard aGuard;
280 :
281 2 : vcl::Window *pWin = GetWindow();
282 :
283 2 : CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
284 :
285 2 : Point aPixPos( pWin->GetWindowExtentsRelative( 0 ).TopLeft() );
286 2 : awt::Point aLoc( aPixPos.getX(), aPixPos.getY() );
287 :
288 2 : return aLoc;
289 : }
290 :
291 0 : ::com::sun::star::awt::Size SAL_CALL SwAccessibleDocumentBase::getSize()
292 : throw (uno::RuntimeException, std::exception)
293 : {
294 0 : SolarMutexGuard aGuard;
295 :
296 0 : vcl::Window *pWin = GetWindow();
297 :
298 0 : CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
299 :
300 0 : Size aPixSize( pWin->GetWindowExtentsRelative( 0 ).GetSize() );
301 0 : awt::Size aSize( aPixSize.Width(), aPixSize.Height() );
302 :
303 0 : return aSize;
304 : }
305 :
306 0 : sal_Bool SAL_CALL SwAccessibleDocumentBase::containsPoint(
307 : const awt::Point& aPoint )
308 : throw (uno::RuntimeException, std::exception)
309 : {
310 0 : SolarMutexGuard aGuard;
311 :
312 0 : vcl::Window *pWin = GetWindow();
313 :
314 0 : CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
315 :
316 0 : Rectangle aPixBounds( pWin->GetWindowExtentsRelative( 0 ) );
317 0 : aPixBounds.Move(-aPixBounds.Left(), -aPixBounds.Top());
318 :
319 0 : Point aPixPoint( aPoint.X, aPoint.Y );
320 0 : return aPixBounds.IsInside( aPixPoint );
321 : }
322 :
323 0 : uno::Reference< XAccessible > SAL_CALL SwAccessibleDocumentBase::getAccessibleAtPoint(
324 : const awt::Point& aPoint )
325 : throw (uno::RuntimeException, std::exception)
326 : {
327 0 : SolarMutexGuard aGuard;
328 :
329 0 : if( mpChildWin )
330 : {
331 0 : CHECK_FOR_DEFUNC( XAccessibleComponent )
332 :
333 0 : vcl::Window *pWin = GetWindow();
334 0 : CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
335 :
336 0 : Point aPixPoint( aPoint.X, aPoint.Y ); // px rel to window
337 0 : if( mpChildWin->GetWindowExtentsRelative( pWin ).IsInside( aPixPoint ) )
338 0 : return mpChildWin->GetAccessible();
339 : }
340 :
341 0 : return SwAccessibleContext::getAccessibleAtPoint( aPoint );
342 : }
343 :
344 : // SwAccessibeDocument
345 :
346 12 : void SwAccessibleDocument::GetStates(
347 : ::utl::AccessibleStateSetHelper& rStateSet )
348 : {
349 12 : SwAccessibleContext::GetStates( rStateSet );
350 :
351 : // MULTISELECTABLE
352 12 : rStateSet.AddState( AccessibleStateType::MULTI_SELECTABLE );
353 12 : rStateSet.AddState( AccessibleStateType::MANAGES_DESCENDANTS );
354 12 : }
355 :
356 12 : SwAccessibleDocument::SwAccessibleDocument ( SwAccessibleMap* pInitMap ) :
357 : SwAccessibleDocumentBase( pInitMap ),
358 12 : maSelectionHelper( *this )
359 : {
360 12 : SetName( GetResource( STR_ACCESS_DOC_NAME ) );
361 12 : vcl::Window *pWin = pInitMap->GetShell()->GetWin();
362 12 : if( pWin )
363 : {
364 12 : pWin->AddChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener ));
365 12 : sal_uInt16 nCount = pWin->GetChildCount();
366 12 : for( sal_uInt16 i=0; i < nCount; i++ )
367 : {
368 0 : vcl::Window* pChildWin = pWin->GetChild( i );
369 0 : if( pChildWin &&
370 0 : AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() )
371 0 : AddChild( pChildWin, false );
372 : }
373 : }
374 12 : }
375 :
376 36 : SwAccessibleDocument::~SwAccessibleDocument()
377 : {
378 12 : vcl::Window *pWin = GetMap() ? GetMap()->GetShell()->GetWin() : 0;
379 12 : if( pWin )
380 0 : pWin->RemoveChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener ));
381 24 : }
382 :
383 12 : void SwAccessibleDocument::Dispose( bool bRecursive )
384 : {
385 : OSL_ENSURE( GetFrm() && GetMap(), "already disposed" );
386 :
387 12 : vcl::Window *pWin = GetMap() ? GetMap()->GetShell()->GetWin() : 0;
388 12 : if( pWin )
389 12 : pWin->RemoveChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener ));
390 12 : SwAccessibleContext::Dispose( bRecursive );
391 12 : }
392 :
393 74 : IMPL_LINK( SwAccessibleDocument, WindowChildEventListener, VclSimpleEvent*, pEvent )
394 : {
395 : OSL_ENSURE( pEvent && pEvent->ISA( VclWindowEvent ), "Unknown WindowEvent!" );
396 37 : if ( pEvent && pEvent->ISA( VclWindowEvent ) )
397 : {
398 37 : VclWindowEvent *pVclEvent = static_cast< VclWindowEvent * >( pEvent );
399 : OSL_ENSURE( pVclEvent->GetWindow(), "Window???" );
400 37 : switch ( pVclEvent->GetId() )
401 : {
402 : case VCLEVENT_WINDOW_SHOW: // send create on show for direct accessible children
403 : {
404 0 : vcl::Window* pChildWin = static_cast< vcl::Window* >( pVclEvent->GetData() );
405 0 : if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() )
406 : {
407 0 : AddChild( pChildWin );
408 : }
409 : }
410 0 : break;
411 : case VCLEVENT_WINDOW_HIDE: // send destroy on hide for direct accessible children
412 : {
413 12 : vcl::Window* pChildWin = static_cast< vcl::Window* >( pVclEvent->GetData() );
414 12 : if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() )
415 : {
416 0 : RemoveChild( pChildWin );
417 : }
418 : }
419 12 : break;
420 : case VCLEVENT_OBJECT_DYING: // send destroy on hide for direct accessible children
421 : {
422 0 : vcl::Window* pChildWin = pVclEvent->GetWindow();
423 0 : if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() )
424 : {
425 0 : RemoveChild( pChildWin );
426 : }
427 : }
428 0 : break;
429 : }
430 : }
431 37 : return 0;
432 : }
433 :
434 0 : OUString SAL_CALL SwAccessibleDocument::getImplementationName()
435 : throw( uno::RuntimeException, std::exception )
436 : {
437 0 : return OUString(sImplementationName);
438 : }
439 :
440 0 : sal_Bool SAL_CALL SwAccessibleDocument::supportsService(const OUString& sTestServiceName)
441 : throw (uno::RuntimeException, std::exception)
442 : {
443 0 : return cppu::supportsService(this, sTestServiceName);
444 : }
445 :
446 0 : uno::Sequence< OUString > SAL_CALL SwAccessibleDocument::getSupportedServiceNames()
447 : throw( uno::RuntimeException, std::exception )
448 : {
449 0 : uno::Sequence< OUString > aRet(2);
450 0 : OUString* pArray = aRet.getArray();
451 0 : pArray[0] = sServiceName;
452 0 : pArray[1] = sAccessibleServiceName;
453 0 : return aRet;
454 : }
455 :
456 : // XInterface
457 :
458 215 : uno::Any SwAccessibleDocument::queryInterface(
459 : const uno::Type& rType )
460 : throw ( uno::RuntimeException, std::exception )
461 : {
462 215 : uno::Any aRet;
463 215 : if ( rType == cppu::UnoType<XAccessibleSelection>::get() )
464 : {
465 0 : uno::Reference<XAccessibleSelection> aSelect = this;
466 0 : aRet <<= aSelect;
467 : }
468 215 : else if ( rType == cppu::UnoType<XAccessibleExtendedAttributes>::get())
469 : {
470 0 : uno::Reference<XAccessibleExtendedAttributes> aAttribute = this;
471 0 : aRet <<= aAttribute;
472 : }
473 215 : else if(rType == cppu::UnoType<XAccessibleGetAccFlowTo>::get())
474 : {
475 0 : uno::Reference<XAccessibleGetAccFlowTo> AccFlowTo = this;
476 0 : aRet <<= AccFlowTo;
477 : }
478 : else
479 215 : aRet = SwAccessibleContext::queryInterface( rType );
480 215 : return aRet;
481 : }
482 :
483 : // XTypeProvider
484 0 : uno::Sequence< uno::Type > SAL_CALL SwAccessibleDocument::getTypes()
485 : throw(uno::RuntimeException, std::exception)
486 : {
487 0 : uno::Sequence< uno::Type > aTypes( SwAccessibleDocumentBase::getTypes() );
488 :
489 0 : sal_Int32 nIndex = aTypes.getLength();
490 : //Reset types memory alloc
491 0 : aTypes.realloc( nIndex + 1 );
492 :
493 0 : uno::Type* pTypes = aTypes.getArray();
494 0 : pTypes[nIndex] = cppu::UnoType<XAccessibleSelection>::get();
495 0 : return aTypes;
496 : }
497 :
498 0 : uno::Sequence< sal_Int8 > SAL_CALL SwAccessibleDocument::getImplementationId()
499 : throw(uno::RuntimeException, std::exception)
500 : {
501 0 : return css::uno::Sequence<sal_Int8>();
502 : }
503 :
504 : // XAccessibleSelection
505 :
506 0 : void SwAccessibleDocument::selectAccessibleChild(
507 : sal_Int32 nChildIndex )
508 : throw ( lang::IndexOutOfBoundsException,
509 : uno::RuntimeException, std::exception )
510 : {
511 0 : maSelectionHelper.selectAccessibleChild(nChildIndex);
512 0 : }
513 :
514 0 : sal_Bool SwAccessibleDocument::isAccessibleChildSelected(
515 : sal_Int32 nChildIndex )
516 : throw ( lang::IndexOutOfBoundsException,
517 : uno::RuntimeException, std::exception )
518 : {
519 0 : return maSelectionHelper.isAccessibleChildSelected(nChildIndex);
520 : }
521 :
522 0 : void SwAccessibleDocument::clearAccessibleSelection( )
523 : throw ( uno::RuntimeException, std::exception )
524 : {
525 0 : }
526 :
527 0 : void SwAccessibleDocument::selectAllAccessibleChildren( )
528 : throw ( uno::RuntimeException, std::exception )
529 : {
530 0 : maSelectionHelper.selectAllAccessibleChildren();
531 0 : }
532 :
533 0 : sal_Int32 SwAccessibleDocument::getSelectedAccessibleChildCount( )
534 : throw ( uno::RuntimeException, std::exception )
535 : {
536 0 : return maSelectionHelper.getSelectedAccessibleChildCount();
537 : }
538 :
539 0 : uno::Reference<XAccessible> SwAccessibleDocument::getSelectedAccessibleChild(
540 : sal_Int32 nSelectedChildIndex )
541 : throw ( lang::IndexOutOfBoundsException,
542 : uno::RuntimeException, std::exception)
543 : {
544 0 : return maSelectionHelper.getSelectedAccessibleChild(nSelectedChildIndex);
545 : }
546 :
547 : // index has to be treated as global child index.
548 0 : void SwAccessibleDocument::deselectAccessibleChild(
549 : sal_Int32 nChildIndex )
550 : throw ( lang::IndexOutOfBoundsException,
551 : uno::RuntimeException, std::exception )
552 : {
553 0 : maSelectionHelper.deselectAccessibleChild( nChildIndex );
554 0 : }
555 :
556 0 : uno::Any SAL_CALL SwAccessibleDocument::getExtendedAttributes()
557 : throw (::com::sun::star::lang::IndexOutOfBoundsException,
558 : ::com::sun::star::uno::RuntimeException,
559 : std::exception)
560 : {
561 0 : SolarMutexGuard g;
562 :
563 0 : uno::Any anyAtrribute;
564 0 : SwDoc *pDoc = GetMap() ? GetShell()->GetDoc() : 0;
565 :
566 0 : if (!pDoc)
567 0 : return anyAtrribute;
568 0 : SwCrsrShell* pCrsrShell = GetCrsrShell();
569 0 : if( !pCrsrShell )
570 0 : return anyAtrribute;
571 :
572 0 : SwFEShell* pFEShell = pCrsrShell->ISA( SwFEShell )
573 : ? static_cast<SwFEShell*>( pCrsrShell )
574 0 : : 0;
575 0 : OUString sAttrName;
576 0 : OUString sValue;
577 : sal_uInt16 nPage, nLogPage;
578 0 : OUString sDisplay;
579 :
580 0 : if( pFEShell )
581 : {
582 0 : pFEShell->GetPageNumber(-1,true,nPage,nLogPage,sDisplay);
583 0 : sAttrName = "page-name:";
584 :
585 0 : sValue = sAttrName + sDisplay ;
586 0 : sAttrName = ";page-number:";
587 0 : sValue += sAttrName;
588 0 : sValue += OUString::number( nPage ) ;
589 0 : sAttrName = ";total-pages:";
590 0 : sValue += sAttrName;
591 0 : sValue += OUString::number( pCrsrShell->GetPageCnt() ) ;
592 0 : sValue += ";";
593 :
594 0 : sAttrName = "line-number:";
595 :
596 0 : SwContentFrm* pCurrFrm = pCrsrShell->GetCurrFrm();
597 0 : SwPageFrm* pCurrPage=static_cast<SwFrm*>(pCurrFrm)->FindPageFrm();
598 0 : sal_uLong nLineNum = 0;
599 0 : SwTextFrm* pTextFrm = NULL;
600 0 : SwTextFrm* pCurrTextFrm = NULL;
601 0 : pTextFrm = static_cast< SwTextFrm* >(static_cast< SwPageFrm* > (pCurrPage)->ContainsContent());
602 0 : if (pCurrFrm->IsInFly())//such as, graphic,chart
603 : {
604 0 : SwFlyFrm *pFlyFrm = pCurrFrm->FindFlyFrm();
605 0 : const SwFormatAnchor& rAnchor = pFlyFrm->GetFormat()->GetAnchor();
606 0 : RndStdIds eAnchorId = rAnchor.GetAnchorId();
607 0 : if(eAnchorId == FLY_AS_CHAR)
608 : {
609 0 : const SwFrm *pSwFrm = pFlyFrm->GetAnchorFrm();
610 0 : if(pSwFrm->IsTextFrm())
611 0 : pCurrTextFrm = const_cast<SwTextFrm*>(static_cast<const SwTextFrm*>(pSwFrm));
612 : }
613 : }
614 : else
615 0 : pCurrTextFrm = const_cast<SwTextFrm*>(static_cast<const SwTextFrm* >(pCurrFrm));
616 : //check whether the text frame where the Graph/OLE/Frame anchored is in the Header/Footer
617 0 : SwFrm* pFrm = pCurrTextFrm;
618 0 : while ( pFrm && !pFrm->IsHeaderFrm() && !pFrm->IsFooterFrm() )
619 0 : pFrm = pFrm->GetUpper();
620 0 : if ( pFrm )
621 0 : pCurrTextFrm = NULL;
622 : //check shape
623 0 : if(pCrsrShell->Imp()->GetDrawView())
624 : {
625 0 : const SdrMarkList &rMrkList = pCrsrShell->Imp()->GetDrawView()->GetMarkedObjectList();
626 0 : for ( size_t i = 0; i < rMrkList.GetMarkCount(); ++i )
627 : {
628 0 : SdrObject *pObj = rMrkList.GetMark(i)->GetMarkedSdrObj();
629 0 : SwFrameFormat* pFormat = static_cast<SwDrawContact*>(pObj->GetUserCall())->GetFormat();
630 0 : const SwFormatAnchor& rAnchor = pFormat->GetAnchor();
631 0 : if( FLY_AS_CHAR != rAnchor.GetAnchorId() )
632 0 : pCurrTextFrm = NULL;
633 : }
634 : }
635 : //calculate line number
636 0 : if (pCurrTextFrm && pTextFrm)
637 : {
638 0 : if (!(pCurrTextFrm->IsInTab() || pCurrTextFrm->IsInFootnote()))
639 : {
640 0 : while( pTextFrm != pCurrTextFrm )
641 : {
642 : //check header/footer
643 0 : pFrm = pTextFrm;
644 0 : while ( pFrm && !pFrm->IsHeaderFrm() && !pFrm->IsFooterFrm() )
645 0 : pFrm = pFrm->GetUpper();
646 0 : if ( pFrm )
647 : {
648 0 : pTextFrm = static_cast< SwTextFrm*>(pTextFrm->GetNextContentFrm());
649 0 : continue;
650 : }
651 0 : if (!(pTextFrm->IsInTab() || pTextFrm->IsInFootnote() || pTextFrm->IsInFly()))
652 0 : nLineNum += pTextFrm->GetThisLines();
653 0 : pTextFrm = static_cast< SwTextFrm* >(pTextFrm ->GetNextContentFrm());
654 : }
655 0 : SwPaM* pCaret = pCrsrShell->GetCrsr();
656 0 : if (!pCurrTextFrm->IsEmpty() && pCaret)
657 : {
658 0 : if (pCurrTextFrm->IsTextFrm())
659 : {
660 0 : const SwPosition* pPoint = NULL;
661 0 : if(pCurrTextFrm->IsInFly())
662 : {
663 0 : SwFlyFrm *pFlyFrm = pCurrTextFrm->FindFlyFrm();
664 0 : const SwFormatAnchor& rAnchor = pFlyFrm->GetFormat()->GetAnchor();
665 0 : pPoint= rAnchor.GetContentAnchor();
666 : }
667 : else
668 0 : pPoint = pCaret->GetPoint();
669 0 : const sal_Int32 nActPos = pPoint->nContent.GetIndex();
670 0 : nLineNum += pCurrTextFrm->GetLineCount( nActPos );
671 : }
672 : else//graphic, form, shape, etc.
673 : {
674 0 : SwPosition* pPoint = pCaret->GetPoint();
675 0 : Point aPt = pCrsrShell->_GetCrsr()->GetPtPos();
676 0 : if( pCrsrShell->GetLayout()->GetCrsrOfst( pPoint, aPt/*,* &eTmpState*/ ) )
677 : {
678 0 : const sal_Int32 nActPos = pPoint->nContent.GetIndex();
679 0 : nLineNum += pCurrTextFrm->GetLineCount( nActPos );
680 : }
681 : }
682 : }
683 : else
684 0 : ++nLineNum;
685 : }
686 : }
687 :
688 0 : sValue += sAttrName;
689 0 : sValue += OUString::number( nLineNum ) ;
690 :
691 0 : sValue += ";";
692 :
693 0 : SwFrm* pCurrCol=static_cast<SwFrm*>(pCurrFrm)->FindColFrm();
694 :
695 0 : sAttrName = "column-number:";
696 0 : sValue += sAttrName;
697 :
698 0 : int nCurrCol = 1;
699 0 : if(pCurrCol!=NULL)
700 : {
701 : //SwLayoutFrm* pParent = pCurrCol->GetUpper();
702 0 : SwFrm* pCurrPageCol=static_cast<SwFrm*>(pCurrFrm)->FindColFrm();
703 0 : while(pCurrPageCol && pCurrPageCol->GetUpper() && pCurrPageCol->GetUpper()->IsPageFrm())
704 : {
705 0 : pCurrPageCol = pCurrPageCol->GetUpper();
706 : }
707 :
708 0 : SwLayoutFrm* pParent = pCurrPageCol->GetUpper();
709 :
710 0 : if(pParent!=NULL)
711 : {
712 0 : SwFrm* pCol = pParent->Lower();
713 0 : while(pCol&&(pCol!=pCurrPageCol))
714 : {
715 0 : pCol = pCol->GetNext();
716 0 : ++nCurrCol;
717 : }
718 : }
719 : }
720 0 : sValue += OUString::number( nCurrCol ) ;
721 0 : sValue += ";";
722 :
723 0 : sAttrName = "total-columns:";
724 :
725 0 : const SwFormatCol &rFormatCol=pCurrPage->GetAttrSet()->GetCol();
726 0 : sal_uInt16 nColCount=rFormatCol.GetNumCols();
727 0 : nColCount = nColCount>0?nColCount:1;
728 0 : sValue += sAttrName;
729 0 : sValue += OUString::number( nColCount ) ;
730 :
731 0 : sValue += ";";
732 :
733 0 : SwSectionFrm* pCurrSctFrm=static_cast<SwFrm*>(pCurrFrm)->FindSctFrm();
734 0 : if(pCurrSctFrm!=NULL && pCurrSctFrm->GetSection()!=NULL )
735 : {
736 0 : sAttrName = "section-name:";
737 :
738 0 : sValue += sAttrName;
739 0 : OUString sectionName = pCurrSctFrm->GetSection()->GetSectionName();
740 :
741 0 : sectionName = sectionName.replaceFirst( "\\" , "\\\\" );
742 0 : sectionName = sectionName.replaceFirst( "=" , "\\=" );
743 0 : sectionName = sectionName.replaceFirst( ";" , "\\;" );
744 0 : sectionName = sectionName.replaceFirst( "," , "\\," );
745 0 : sectionName = sectionName.replaceFirst( ":" , "\\:" );
746 :
747 0 : sValue += sectionName;
748 :
749 0 : sValue += ";";
750 :
751 : //section-columns-number
752 0 : sAttrName = "section-columns-number:";
753 :
754 0 : nCurrCol = 1;
755 :
756 0 : if(pCurrCol!=NULL)
757 : {
758 0 : SwLayoutFrm* pParent = pCurrCol->GetUpper();
759 0 : if(pParent!=NULL)
760 : {
761 0 : SwFrm* pCol = pParent->Lower();
762 0 : while(pCol&&(pCol!=pCurrCol))
763 : {
764 0 : pCol = pCol->GetNext();
765 0 : nCurrCol +=1;
766 : }
767 : }
768 : }
769 0 : sValue += sAttrName;
770 0 : sValue += OUString::number( nCurrCol ) ;
771 0 : sValue += ";";
772 :
773 : //section-total-columns
774 0 : sAttrName = "section-total-columns:";
775 0 : const SwFormatCol &rFormatSctCol=pCurrSctFrm->GetAttrSet()->GetCol();
776 0 : sal_uInt16 nSctColCount=rFormatSctCol.GetNumCols();
777 0 : nSctColCount = nSctColCount>0?nSctColCount:1;
778 0 : sValue += sAttrName;
779 0 : sValue += OUString::number( nSctColCount ) ;
780 :
781 0 : sValue += ";";
782 : }
783 :
784 0 : anyAtrribute <<= sValue;
785 : }
786 0 : return anyAtrribute;
787 : }
788 :
789 1 : sal_Int32 SAL_CALL SwAccessibleDocument::getBackground()
790 : throw (::com::sun::star::uno::RuntimeException, std::exception)
791 : {
792 1 : SolarMutexGuard aGuard;
793 1 : return SW_MOD()->GetColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor;
794 : }
795 :
796 : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >
797 0 : SAL_CALL SwAccessibleDocument::getAccFlowTo(const ::com::sun::star::uno::Any& rAny, sal_Int32 nType)
798 : throw (::com::sun::star::uno::RuntimeException,
799 : std::exception)
800 : {
801 0 : SolarMutexGuard g;
802 :
803 0 : const sal_Int32 FORSPELLCHECKFLOWTO = 1;
804 0 : const sal_Int32 FORFINDREPLACEFLOWTO = 2;
805 0 : SwAccessibleMap* pAccMap = GetMap();
806 0 : if ( !pAccMap )
807 : {
808 0 : return uno::Sequence< uno::Any >();
809 : }
810 :
811 0 : if ( nType == FORSPELLCHECKFLOWTO )
812 : {
813 0 : uno::Reference< ::com::sun::star::drawing::XShape > xShape;
814 0 : rAny >>= xShape;
815 0 : if( xShape.is() )
816 : {
817 0 : SdrObject* pObj = GetSdrObjectFromXShape(xShape);
818 0 : if( pObj )
819 : {
820 0 : uno::Reference<XAccessible> xAcc = pAccMap->GetContext(pObj, this, false);
821 0 : uno::Reference < XAccessibleSelection > xAccSelection( xAcc, uno::UNO_QUERY );
822 0 : if ( xAccSelection.is() )
823 : {
824 : try
825 : {
826 0 : if ( xAccSelection->getSelectedAccessibleChildCount() )
827 : {
828 0 : uno::Reference < XAccessible > xSel = xAccSelection->getSelectedAccessibleChild( 0 );
829 0 : if ( xSel.is() )
830 : {
831 0 : uno::Reference < XAccessibleContext > xSelContext( xSel->getAccessibleContext() );
832 0 : if ( xSelContext.is() )
833 : {
834 : //if in sw we find the selected paragraph here
835 0 : if ( xSelContext->getAccessibleRole() == AccessibleRole::PARAGRAPH )
836 : {
837 0 : uno::Sequence<uno::Any> aRet( 1 );
838 0 : aRet[0] = uno::makeAny( xSel );
839 0 : return aRet;
840 : }
841 0 : }
842 0 : }
843 : }
844 : }
845 0 : catch ( const com::sun::star::lang::IndexOutOfBoundsException& )
846 : {
847 0 : return uno::Sequence< uno::Any >();
848 : }
849 : //end of try...catch
850 0 : }
851 : }
852 : }
853 : else
854 : {
855 0 : uno::Reference< XAccessible > xAcc = pAccMap->GetCursorContext();
856 0 : SwAccessibleContext *pAccImpl = static_cast< SwAccessibleContext *>( xAcc.get() );
857 0 : if ( pAccImpl && pAccImpl->getAccessibleRole() == AccessibleRole::PARAGRAPH )
858 : {
859 0 : uno::Sequence< uno::Any > aRet(1);
860 0 : aRet[0] = uno::makeAny( xAcc );
861 0 : return aRet;
862 0 : }
863 0 : }
864 : }
865 0 : else if ( nType == FORFINDREPLACEFLOWTO )
866 : {
867 0 : SwCrsrShell* pCrsrShell = GetCrsrShell();
868 0 : if ( pCrsrShell )
869 : {
870 0 : SwPaM *_pStartCrsr = pCrsrShell->GetCrsr(), *__pStartCrsr = _pStartCrsr;
871 0 : SwContentNode* pPrevNode = NULL;
872 0 : std::vector<SwFrm*> vFrmList;
873 0 : do
874 : {
875 0 : if ( _pStartCrsr && _pStartCrsr->HasMark() )
876 : {
877 0 : SwContentNode* pContentNode = _pStartCrsr->GetContentNode();
878 0 : if ( pContentNode == pPrevNode )
879 : {
880 0 : continue;
881 : }
882 0 : SwFrm* pFrm = pContentNode ? pContentNode->getLayoutFrm( pCrsrShell->GetLayout() ) : NULL;
883 0 : if ( pFrm )
884 : {
885 0 : vFrmList.push_back( pFrm );
886 : }
887 :
888 0 : pPrevNode = pContentNode;
889 : }
890 : }
891 :
892 0 : while( _pStartCrsr && ( (_pStartCrsr = _pStartCrsr->GetNext()) != __pStartCrsr) );
893 :
894 0 : if ( vFrmList.size() )
895 : {
896 0 : uno::Sequence< uno::Any > aRet(vFrmList.size());
897 0 : std::vector<SwFrm*>::iterator aIter = vFrmList.begin();
898 0 : for ( sal_Int32 nIndex = 0; aIter != vFrmList.end(); ++aIter, nIndex++ )
899 : {
900 0 : uno::Reference< XAccessible > xAcc = pAccMap->GetContext(*aIter, false);
901 0 : if ( xAcc.is() )
902 : {
903 0 : SwAccessibleContext *pAccImpl = static_cast< SwAccessibleContext *>( xAcc.get() );
904 0 : if ( pAccImpl && pAccImpl->getAccessibleRole() == AccessibleRole::PARAGRAPH )
905 : {
906 0 : aRet[nIndex] = uno::makeAny( xAcc );
907 : }
908 : }
909 0 : }
910 :
911 0 : return aRet;
912 0 : }
913 : }
914 : }
915 :
916 0 : return uno::Sequence< uno::Any >();
917 177 : }
918 :
919 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|