1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 #include "AccessibleDocumentViewBase.hxx"
27 #include <com/sun/star/drawing/XDrawPage.hpp>
28 #include <com/sun/star/drawing/XDrawView.hpp>
29 #include <com/sun/star/drawing/XShapes.hpp>
30 #include <com/sun/star/container/XChild.hpp>
31 #include <com/sun/star/frame/XController.hpp>
32 #include <com/sun/star/frame/XFrame.hpp>
33 #include <com/sun/star/document/XEventBroadcaster.hpp>
34 #include <com/sun/star/beans/XPropertySet.hpp>
35 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
36 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
37 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38 #include <rtl/ustring.h>
39 #include<sfx2/viewfrm.hxx>
40 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
41 #include <sfx2/objsh.hxx>
42 #include <svx/AccessibleShape.hxx>
43 
44 #include <svx/svdobj.hxx>
45 #include <svx/svdmodel.hxx>
46 #include <svx/unoapi.hxx>
47 #include <toolkit/helper/vclunohelper.hxx>
48 #include "Window.hxx"
49 #include <vcl/svapp.hxx>
50 #include "OutlineViewShell.hxx"
51 
52 #include "SlideViewShell.hxx"
53 
54 #include <svx/svdlayer.hxx>
55 #include <editeng/editobj.hxx>
56 #include "LayerTabBar.hxx"
57 #include <svtools/colorcfg.hxx>
58 #include "ViewShell.hxx"
59 #include "View.hxx"
60 #include <memory>
61 
62 using ::rtl::OUString;
63 using namespace ::com::sun::star;
64 using namespace	::com::sun::star::accessibility;
65 using ::com::sun::star::uno::Reference;
66 
67 class SfxViewFrame;
68 
69 namespace accessibility {
70 
71 //=====  internal  ============================================================
AccessibleDocumentViewBase(::sd::Window * pSdWindow,::sd::ViewShell * pViewShell,const uno::Reference<frame::XController> & rxController,const uno::Reference<XAccessible> & rxParent)72 AccessibleDocumentViewBase::AccessibleDocumentViewBase (
73     ::sd::Window* pSdWindow,
74     ::sd::ViewShell* pViewShell,
75     const uno::Reference<frame::XController>& rxController,
76     const uno::Reference<XAccessible>& rxParent)
77     : AccessibleContextBase (rxParent, AccessibleRole::DOCUMENT),
78       mpWindow (pSdWindow),
79       mxController (rxController),
80       mxModel (NULL),
81       maViewForwarder (
82         static_cast<SdrPaintView*>(pViewShell->GetView()),
83         *static_cast<OutputDevice*>(pSdWindow))
84 {
85     if (mxController.is())
86         mxModel = mxController->getModel();
87 
88     // Fill the shape tree info.
89     maShapeTreeInfo.SetModelBroadcaster (
90         uno::Reference<document::XEventBroadcaster>(
91             mxModel, uno::UNO_QUERY));
92     maShapeTreeInfo.SetController (mxController);
93     maShapeTreeInfo.SetSdrView (pViewShell->GetView());
94     maShapeTreeInfo.SetWindow (pSdWindow);
95     maShapeTreeInfo.SetViewForwarder (&maViewForwarder);
96 
97     mxWindow = ::VCLUnoHelper::GetInterface (pSdWindow);
98 	mpViewShell = pViewShell;
99 }
100 
101 
102 
103 
~AccessibleDocumentViewBase(void)104 AccessibleDocumentViewBase::~AccessibleDocumentViewBase (void)
105 {
106     // At this place we should be disposed.  You may want to add a
107     // corresponding assertion into the destructor of a derived class.
108 }
109 
110 
111 
112 
Init(void)113 void AccessibleDocumentViewBase::Init (void)
114 {
115     // Finish the initialization of the shape tree info container.
116     maShapeTreeInfo.SetDocumentWindow (this);
117 
118     // Register as window listener to stay up to date with its size and
119     // position.
120     mxWindow->addWindowListener (this);
121     // Register as focus listener to
122     mxWindow->addFocusListener (this);
123 
124     // Determine the list of shapes on the current page.
125     uno::Reference<drawing::XShapes> xShapeList;
126     uno::Reference<drawing::XDrawView> xView (mxController, uno::UNO_QUERY);
127     if (xView.is())
128         xShapeList = uno::Reference<drawing::XShapes> (
129             xView->getCurrentPage(), uno::UNO_QUERY);
130 
131     // Register this object as dispose event listener at the model.
132 	if (mxModel.is())
133 		mxModel->addEventListener (
134             static_cast<awt::XWindowListener*>(this));
135 
136     // Register as property change listener at the controller.
137     uno::Reference<beans::XPropertySet> xSet (mxController, uno::UNO_QUERY);
138     if (xSet.is())
139         xSet->addPropertyChangeListener (
140             OUString (RTL_CONSTASCII_USTRINGPARAM("")),
141             static_cast<beans::XPropertyChangeListener*>(this));
142 
143     // Register this object as dispose event listener at the controller.
144     if (mxController.is())
145         mxController->addEventListener (
146             static_cast<awt::XWindowListener*>(this));
147 
148     // Register at VCL Window to be informed of activated and deactivated
149     // OLE objects.
150     Window* pWindow = maShapeTreeInfo.GetWindow();
151     if (pWindow != NULL)
152     {
153         maWindowLink = LINK(
154             this, AccessibleDocumentViewBase, WindowChildEventListener);
155 
156         pWindow->AddChildEventListener (maWindowLink);
157 
158         sal_uInt16 nCount = pWindow->GetChildCount();
159         for (sal_uInt16 i=0; i<nCount; i++)
160         {
161             Window* pChildWindow = pWindow->GetChild (i);
162             if (pChildWindow &&
163                 (AccessibleRole::EMBEDDED_OBJECT
164                     ==pChildWindow->GetAccessibleRole()))
165             {
166                 SetAccessibleOLEObject (pChildWindow->GetAccessible());
167             }
168         }
169     }
170 	SfxObjectShell* pObjShell = mpViewShell->GetViewFrame()->GetObjectShell();
171 	if(!pObjShell->IsReadOnly())
172 		SetState(AccessibleStateType::EDITABLE);
173 }
174 
175 
176 
177 
IMPL_LINK(AccessibleDocumentViewBase,WindowChildEventListener,VclSimpleEvent *,pEvent)178 IMPL_LINK(AccessibleDocumentViewBase, WindowChildEventListener,
179     VclSimpleEvent*, pEvent)
180 {
181     OSL_ASSERT(pEvent!=NULL && pEvent->ISA(VclWindowEvent));
182     if (pEvent!=NULL && pEvent->ISA(VclWindowEvent))
183     {
184         VclWindowEvent* pWindowEvent = static_cast<VclWindowEvent*>(pEvent);
185         //      DBG_ASSERT( pVclEvent->GetWindow(), "Window???" );
186         switch (pWindowEvent->GetId())
187         {
188             case VCLEVENT_OBJECT_DYING:
189             {
190                 // Window is dying.  Unregister from VCL Window.
191                 // This is also attempted in the disposing() method.
192                 Window* pWindow = maShapeTreeInfo.GetWindow();
193                 Window* pDyingWindow = static_cast<Window*>(
194                     pWindowEvent->GetWindow());
195                 if (pWindow==pDyingWindow && pWindow!=NULL && maWindowLink.IsSet())
196                 {
197                     pWindow->RemoveChildEventListener (maWindowLink);
198                     maWindowLink = Link();
199                 }
200             }
201             break;
202 
203             case VCLEVENT_WINDOW_SHOW:
204             {
205                 // A new window has been created.  Is it an OLE object?
206                 Window* pChildWindow = static_cast<Window*>(
207                     pWindowEvent->GetData());
208                 if (pChildWindow!=NULL
209                     && (pChildWindow->GetAccessibleRole()
210                         == AccessibleRole::EMBEDDED_OBJECT))
211                 {
212                     SetAccessibleOLEObject (pChildWindow->GetAccessible());
213                 }
214             }
215             break;
216 
217             case VCLEVENT_WINDOW_HIDE:
218             {
219                 // A window has been destroyed.  Has that been an OLE
220                 // object?
221                 Window* pChildWindow = static_cast<Window*>(
222                     pWindowEvent->GetData());
223                 if (pChildWindow!=NULL
224                     && (pChildWindow->GetAccessibleRole()
225                         == AccessibleRole::EMBEDDED_OBJECT))
226                 {
227                     SetAccessibleOLEObject (NULL);
228                 }
229             }
230             break;
231         }
232     }
233 
234     return 0;
235 }
236 
237 
238 
239 
240 //=====  IAccessibleViewForwarderListener  ====================================
241 
ViewForwarderChanged(ChangeType,const IAccessibleViewForwarder *)242 void AccessibleDocumentViewBase::ViewForwarderChanged(ChangeType, const IAccessibleViewForwarder* )
243 {
244     // Empty
245 }
246 
247 
248 
249 
250 //=====  XAccessibleContext  ==================================================
251 
252 Reference<XAccessible> SAL_CALL
getAccessibleParent(void)253    	AccessibleDocumentViewBase::getAccessibleParent (void)
254     throw (uno::RuntimeException)
255 {
256     ThrowIfDisposed ();
257 
258     return AccessibleContextBase::getAccessibleParent();
259 }
260 
261 
262 
263 sal_Int32 SAL_CALL
getAccessibleChildCount(void)264     AccessibleDocumentViewBase::getAccessibleChildCount (void)
265     throw (uno::RuntimeException)
266 {
267     ThrowIfDisposed ();
268 
269     if (mxAccessibleOLEObject.is())
270         return 1;
271     else
272         return 0;
273 }
274 
275 
276 
277 
278 Reference<XAccessible> SAL_CALL
getAccessibleChild(sal_Int32 nIndex)279     AccessibleDocumentViewBase::getAccessibleChild (sal_Int32 nIndex)
280     throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
281 {
282     ThrowIfDisposed ();
283 
284     ::osl::MutexGuard aGuard (maMutex);
285     if (mxAccessibleOLEObject.is())
286         if (nIndex == 0)
287             return mxAccessibleOLEObject;
288 
289     throw lang::IndexOutOfBoundsException (
290         ::rtl::OUString::createFromAscii ("no child with index ")
291         + rtl::OUString::valueOf(nIndex),
292 		NULL);
293 }
294 
295 
296 
297 
298 //=====  XAccessibleComponent  ================================================
299 
300 /** Iterate over all children and test whether the specified point lies
301     within one of their bounding boxes.  Return the first child for which
302     this is true.
303 */
304 uno::Reference<XAccessible > SAL_CALL
getAccessibleAtPoint(const awt::Point & aPoint)305     AccessibleDocumentViewBase::getAccessibleAtPoint (
306         const awt::Point& aPoint)
307     throw (uno::RuntimeException)
308 {
309     ThrowIfDisposed ();
310 
311     ::osl::MutexGuard aGuard (maMutex);
312     uno::Reference<XAccessible> xChildAtPosition;
313 
314     sal_Int32 nChildCount = getAccessibleChildCount ();
315     for (sal_Int32 i=nChildCount-1; i>=0; --i)
316     {
317         Reference<XAccessible> xChild (getAccessibleChild (i));
318         if (xChild.is())
319         {
320             Reference<XAccessibleComponent> xChildComponent (
321                 xChild->getAccessibleContext(), uno::UNO_QUERY);
322             if (xChildComponent.is())
323             {
324                 awt::Rectangle aBBox (xChildComponent->getBounds());
325                 if ( (aPoint.X >= aBBox.X)
326                     && (aPoint.Y >= aBBox.Y)
327                     && (aPoint.X < aBBox.X+aBBox.Width)
328                     && (aPoint.Y < aBBox.Y+aBBox.Height) )
329                 {
330                     xChildAtPosition = xChild;
331                     break;
332                 }
333             }
334         }
335     }
336 
337     // Have not found a child under the given point.  Returning empty
338     // reference to indicate this.
339     return xChildAtPosition;
340 }
341 
342 
343 
344 
345 awt::Rectangle SAL_CALL
getBounds(void)346     AccessibleDocumentViewBase::getBounds (void)
347     throw (::com::sun::star::uno::RuntimeException)
348 {
349     ThrowIfDisposed ();
350 
351     // Transform visible area into screen coordinates.
352     ::Rectangle aVisibleArea (
353         maShapeTreeInfo.GetViewForwarder()->GetVisibleArea());
354     ::Point aPixelTopLeft (
355         maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
356             aVisibleArea.TopLeft()));
357     ::Point aPixelSize (
358         maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
359             aVisibleArea.BottomRight())
360         - aPixelTopLeft);
361 
362     // Prepare to subtract the parent position to transform into relative
363     // coordinates.
364     awt::Point aParentPosition;
365     Reference<XAccessible> xParent = getAccessibleParent ();
366     if (xParent.is())
367     {
368         Reference<XAccessibleComponent> xParentComponent (
369             xParent->getAccessibleContext(), uno::UNO_QUERY);
370         if (xParentComponent.is())
371             aParentPosition = xParentComponent->getLocationOnScreen();
372     }
373 
374     return awt::Rectangle (
375         aPixelTopLeft.X() - aParentPosition.X,
376         aPixelTopLeft.Y() - aParentPosition.Y,
377         aPixelSize.X(),
378         aPixelSize.Y());
379 }
380 
381 
382 
383 
384 awt::Point SAL_CALL
getLocation(void)385     AccessibleDocumentViewBase::getLocation (void)
386     throw (uno::RuntimeException)
387 {
388     ThrowIfDisposed ();
389     awt::Rectangle aBoundingBox (getBounds());
390     return awt::Point (aBoundingBox.X, aBoundingBox.Y);
391 }
392 
393 
394 
395 
396 awt::Point SAL_CALL
getLocationOnScreen(void)397     AccessibleDocumentViewBase::getLocationOnScreen (void)
398     throw (uno::RuntimeException)
399 {
400     ThrowIfDisposed ();
401     ::Point aLogicalPoint (maShapeTreeInfo.GetViewForwarder()->GetVisibleArea().TopLeft());
402     ::Point aPixelPoint (maShapeTreeInfo.GetViewForwarder()->LogicToPixel (aLogicalPoint));
403     return awt::Point (aPixelPoint.X(), aPixelPoint.Y());
404 }
405 
406 
407 
408 
409 awt::Size SAL_CALL
getSize(void)410     AccessibleDocumentViewBase::getSize (void)
411     throw (uno::RuntimeException)
412 {
413     ThrowIfDisposed ();
414 
415     // Transform visible area into screen coordinates.
416     ::Rectangle aVisibleArea (
417         maShapeTreeInfo.GetViewForwarder()->GetVisibleArea());
418     ::Point aPixelTopLeft (
419         maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
420             aVisibleArea.TopLeft()));
421     ::Point aPixelSize (
422         maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
423             aVisibleArea.BottomRight())
424         - aPixelTopLeft);
425 
426     return awt::Size (aPixelSize.X(), aPixelSize.Y());
427 }
428 
429 
430 
431 
432 //=====  XInterface  ==========================================================
433 
434 uno::Any SAL_CALL
queryInterface(const uno::Type & rType)435     AccessibleDocumentViewBase::queryInterface (const uno::Type & rType)
436     throw (uno::RuntimeException)
437 {
438     uno::Any aReturn = AccessibleContextBase::queryInterface (rType);
439     if ( ! aReturn.hasValue())
440         aReturn = ::cppu::queryInterface (rType,
441             static_cast<XAccessibleComponent*>(this),
442             static_cast<XAccessibleSelection*>(this),
443             static_cast<lang::XEventListener*>(
444                 static_cast<awt::XWindowListener*>(this)),
445             static_cast<beans::XPropertyChangeListener*>(this),
446             static_cast<awt::XWindowListener*>(this),
447             static_cast<awt::XFocusListener*>(this)
448 		   ,static_cast<XAccessibleExtendedAttributes*>(this)
449 		   ,static_cast<XAccessibleGetAccFlowTo*>(this)
450             );
451     return aReturn;
452 }
453 
454 
455 
456 
457 void SAL_CALL
acquire(void)458     AccessibleDocumentViewBase::acquire (void)
459     throw ()
460 {
461     AccessibleContextBase::acquire ();
462 }
463 
464 
465 
466 
467 void SAL_CALL
release(void)468     AccessibleDocumentViewBase::release (void)
469     throw ()
470 {
471     AccessibleContextBase::release ();
472 }
473 
474 
475 
476 
477 //=====  XServiceInfo  ========================================================
478 
479 ::rtl::OUString SAL_CALL
getImplementationName(void)480     AccessibleDocumentViewBase::getImplementationName (void)
481     throw (::com::sun::star::uno::RuntimeException)
482 {
483 	return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AccessibleDocumentViewBase"));
484 }
485 
486 
487 
488 
489 ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL
getSupportedServiceNames(void)490     AccessibleDocumentViewBase::getSupportedServiceNames (void)
491     throw (::com::sun::star::uno::RuntimeException)
492 {
493     ThrowIfDisposed ();
494     return AccessibleContextBase::getSupportedServiceNames ();
495 }
496 
497 
498 
499 
500 
501 //=====  XTypeProvider  =======================================================
502 
503 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> SAL_CALL
getTypes(void)504     AccessibleDocumentViewBase::getTypes (void)
505     throw (::com::sun::star::uno::RuntimeException)
506 {
507     ThrowIfDisposed ();
508 
509     // Get list of types from the context base implementation, ...
510 	uno::Sequence<uno::Type> aTypeList (AccessibleContextBase::getTypes());
511     // ... get list of types from component base implementation, ...
512 	uno::Sequence<uno::Type> aComponentTypeList (AccessibleComponentBase::getTypes());
513 
514 
515     // ...and add the additional type for the component, ...
516     const uno::Type aLangEventListenerType =
517      	::getCppuType((const uno::Reference<lang::XEventListener>*)0);
518     const uno::Type aPropertyChangeListenerType =
519      	::getCppuType((const uno::Reference<beans::XPropertyChangeListener>*)0);
520     const uno::Type aWindowListenerType =
521      	::getCppuType((const uno::Reference<awt::XWindowListener>*)0);
522     const uno::Type aFocusListenerType =
523      	::getCppuType((const uno::Reference<awt::XFocusListener>*)0);
524     const uno::Type aEventBroadcaster =
525      	::getCppuType((const uno::Reference<XAccessibleEventBroadcaster>*)0);
526 
527     // ... and merge them all into one list.
528     sal_Int32 nTypeCount (aTypeList.getLength()),
529         nComponentTypeCount (aComponentTypeList.getLength()),
530         i;
531 
532     aTypeList.realloc (nTypeCount + nComponentTypeCount + 5);
533 
534     for (i=0; i<nComponentTypeCount; i++)
535         aTypeList[nTypeCount + i] = aComponentTypeList[i];
536 
537     aTypeList[nTypeCount + i++ ] = aLangEventListenerType;
538     aTypeList[nTypeCount + i++] = aPropertyChangeListenerType;
539     aTypeList[nTypeCount + i++] = aWindowListenerType;
540     aTypeList[nTypeCount + i++] = aFocusListenerType;
541     aTypeList[nTypeCount + i++] = aEventBroadcaster;
542 
543 	return aTypeList;
544 }
545 
546 
547 
548 
impl_dispose()549 void AccessibleDocumentViewBase::impl_dispose()
550 {
551     // Unregister from VCL Window.
552     Window* pWindow = maShapeTreeInfo.GetWindow();
553     if (maWindowLink.IsSet())
554     {
555         if (pWindow)
556             pWindow->RemoveChildEventListener (maWindowLink);
557         maWindowLink = Link();
558     }
559     else
560     {
561         DBG_ASSERT (pWindow, "AccessibleDocumentViewBase::disposing");
562     }
563 
564     // Unregister from window.
565     if (mxWindow.is())
566     {
567         mxWindow->removeWindowListener (this);
568         mxWindow->removeFocusListener (this);
569         mxWindow = NULL;
570     }
571 
572     // Unregister form the model.
573     if (mxModel.is())
574         mxModel->removeEventListener (
575             static_cast<awt::XWindowListener*>(this));
576 
577     // Unregister from the controller.
578     if (mxController.is())
579     {
580         uno::Reference<beans::XPropertySet> xSet (mxController, uno::UNO_QUERY);
581         if (xSet.is())
582             xSet->removePropertyChangeListener (
583                 OUString (RTL_CONSTASCII_USTRINGPARAM("")),
584                 static_cast<beans::XPropertyChangeListener*>(this));
585 
586         mxController->removeEventListener (
587             static_cast<awt::XWindowListener*>(this));
588     }
589 
590     // Propagate change of controller down the shape tree.
591     maShapeTreeInfo.SetControllerBroadcaster (NULL);
592 
593     // Reset the model reference.
594     mxModel = NULL;
595     // Reset the model reference.
596     mxController = NULL;
597 
598     maShapeTreeInfo.SetDocumentWindow (NULL);
599 }
600 
601 
602 
603 
604 //=====  XEventListener  ======================================================
605 
606 void SAL_CALL
disposing(const lang::EventObject & rEventObject)607     AccessibleDocumentViewBase::disposing (const lang::EventObject& rEventObject)
608     throw (::com::sun::star::uno::RuntimeException)
609 {
610     ThrowIfDisposed ();
611 
612     // Register this object as dispose event and document::XEventListener
613     // listener at the model.
614 
615     if ( ! rEventObject.Source.is())
616     {
617         // Paranoia. Can this really happen?
618     }
619     else if (rEventObject.Source == mxModel || rEventObject.Source == mxController)
620     {
621         impl_dispose();
622     }
623 }
624 
625 //=====  XPropertyChangeListener  =============================================
626 
propertyChange(const beans::PropertyChangeEvent &)627 void SAL_CALL AccessibleDocumentViewBase::propertyChange (const beans::PropertyChangeEvent& )
628     throw (::com::sun::star::uno::RuntimeException)
629 {
630     // Empty
631 }
632 
633 
634 
635 
636 //=====  XWindowListener  =====================================================
637 
638 void SAL_CALL
windowResized(const::com::sun::star::awt::WindowEvent &)639     AccessibleDocumentViewBase::windowResized (const ::com::sun::star::awt::WindowEvent& )
640     throw (::com::sun::star::uno::RuntimeException)
641 {
642     if( IsDisposed() )
643         return;
644 
645     ViewForwarderChanged (
646         IAccessibleViewForwarderListener::VISIBLE_AREA,
647         &maViewForwarder);
648 }
649 
650 
651 
652 
653 void SAL_CALL
windowMoved(const::com::sun::star::awt::WindowEvent &)654     AccessibleDocumentViewBase::windowMoved (const ::com::sun::star::awt::WindowEvent& )
655     throw (::com::sun::star::uno::RuntimeException)
656 {
657     if( IsDisposed() )
658         return;
659 
660     ViewForwarderChanged (
661         IAccessibleViewForwarderListener::VISIBLE_AREA,
662         &maViewForwarder);
663 }
664 
665 
666 
667 
668 void SAL_CALL
windowShown(const::com::sun::star::lang::EventObject &)669     AccessibleDocumentViewBase::windowShown (const ::com::sun::star::lang::EventObject& )
670     throw (::com::sun::star::uno::RuntimeException)
671 {
672     if( IsDisposed() )
673         return;
674 
675     ViewForwarderChanged (
676         IAccessibleViewForwarderListener::VISIBLE_AREA,
677         &maViewForwarder);
678 }
679 
680 
681 
682 
683 void SAL_CALL
windowHidden(const::com::sun::star::lang::EventObject &)684     AccessibleDocumentViewBase::windowHidden (const ::com::sun::star::lang::EventObject& )
685     throw (::com::sun::star::uno::RuntimeException)
686 {
687     if( IsDisposed() )
688         return;
689 
690     ViewForwarderChanged (
691         IAccessibleViewForwarderListener::VISIBLE_AREA,
692         &maViewForwarder);
693 }
694 
695 
696 
697 
698 //=====  XFocusListener  ==================================================
699 
focusGained(const::com::sun::star::awt::FocusEvent & e)700 void AccessibleDocumentViewBase::focusGained (const ::com::sun::star::awt::FocusEvent& e)
701     throw (::com::sun::star::uno::RuntimeException)
702 {
703     ThrowIfDisposed ();
704     if (e.Source == mxWindow)
705         Activated ();
706 }
707 
focusLost(const::com::sun::star::awt::FocusEvent & e)708 void AccessibleDocumentViewBase::focusLost (const ::com::sun::star::awt::FocusEvent& e)
709     throw (::com::sun::star::uno::RuntimeException)
710 {
711     ThrowIfDisposed ();
712     if (e.Source == mxWindow)
713         Deactivated ();
714 }
715 
716 
717 
718 
719 //=====  protected internal  ==================================================
720 
721 // This method is called from the component helper base class while disposing.
disposing(void)722 void SAL_CALL AccessibleDocumentViewBase::disposing (void)
723 {
724     impl_dispose();
725 
726     AccessibleContextBase::disposing ();
727 }
728 
729 
730 
731 
732 ///	Create a name for this view.
733 ::rtl::OUString
CreateAccessibleName(void)734     AccessibleDocumentViewBase::CreateAccessibleName (void)
735     throw (::com::sun::star::uno::RuntimeException)
736 {
737 	return ::rtl::OUString (
738         RTL_CONSTASCII_USTRINGPARAM("AccessibleDocumentViewBase"));
739 }
740 
741 
742 
743 
744 /** Create a description for this view.  Use the model's description or URL
745     if a description is not available.
746 */
747 ::rtl::OUString
CreateAccessibleDescription(void)748     AccessibleDocumentViewBase::CreateAccessibleDescription (void)
749     throw (::com::sun::star::uno::RuntimeException)
750 {
751 	rtl::OUString sDescription;
752 
753     uno::Reference<lang::XServiceInfo> xInfo (mxController, uno::UNO_QUERY);
754     if (xInfo.is())
755     {
756         OUString sFirstService = xInfo->getSupportedServiceNames()[0];
757         if (sFirstService == OUString (
758                 RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DrawingDocumentDrawView")))
759         {
760             sDescription = OUString (RTL_CONSTASCII_USTRINGPARAM("Draw Document"));
761         }
762         else
763             sDescription = sFirstService;
764     }
765     else
766         sDescription = OUString (
767             RTL_CONSTASCII_USTRINGPARAM("Accessible Draw Document"));
768 	return sDescription;
769 }
770 
771 
772 
773 
Activated(void)774 void AccessibleDocumentViewBase::Activated (void)
775 {
776     // Empty.  Overwrite to do something usefull.
777 }
778 
779 
780 
781 
Deactivated(void)782 void AccessibleDocumentViewBase::Deactivated (void)
783 {
784     // Empty.  Overwrite to do something usefull.
785 }
786 
787 
788 
789 
SetAccessibleOLEObject(const Reference<XAccessible> & xOLEObject)790 void AccessibleDocumentViewBase::SetAccessibleOLEObject (
791     const Reference <XAccessible>& xOLEObject)
792 {
793     // Send child event about removed accessible OLE object if necessary.
794     if (mxAccessibleOLEObject != xOLEObject)
795         if (mxAccessibleOLEObject.is())
796             CommitChange (
797                 AccessibleEventId::CHILD,
798                 uno::Any(),
799                 uno::makeAny (mxAccessibleOLEObject));
800 
801     // Assume that the accessible OLE Object disposes itself correctly.
802 
803     {
804         ::osl::MutexGuard aGuard (maMutex);
805         mxAccessibleOLEObject = xOLEObject;
806     }
807 
808     // Send child event about new accessible OLE object if necessary.
809     if (mxAccessibleOLEObject.is())
810         CommitChange (
811             AccessibleEventId::CHILD,
812             uno::makeAny (mxAccessibleOLEObject),
813             uno::Any());
814 }
815 
816 
817 
818 
819 //=====  methods from AccessibleSelectionBase ==================================================
820 
821 // return the member maMutex;
822 ::osl::Mutex&
implGetMutex()823     AccessibleDocumentViewBase::implGetMutex()
824 {
825     return( maMutex );
826 }
827 
828 // return ourself as context in default case
829 uno::Reference< XAccessibleContext >
implGetAccessibleContext()830     AccessibleDocumentViewBase::implGetAccessibleContext()
831     throw (uno::RuntimeException)
832 {
833     return( this );
834 }
835 
836 // return sal_False in default case
837 sal_Bool
implIsSelected(sal_Int32)838     AccessibleDocumentViewBase::implIsSelected( sal_Int32 )
839     throw (uno::RuntimeException)
840 {
841     return( sal_False );
842 }
843 
844 // return nothing in default case
845 void
implSelect(sal_Int32,sal_Bool)846     AccessibleDocumentViewBase::implSelect( sal_Int32, sal_Bool )
847     throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
848 {
849 }
850 
getExtendedAttributes()851 uno::Any SAL_CALL AccessibleDocumentViewBase::getExtendedAttributes()
852 		throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
853 {
854 	uno::Any anyAtrribute;
855 	rtl::OUString sValue;
856 	if (mpViewShell && mpViewShell->ISA(::sd::DrawViewShell))
857 	{
858 		::sd::DrawViewShell* pDrViewSh = (::sd::DrawViewShell*) mpViewShell;
859 		rtl::OUString sName;
860 		String sDisplay;
861 			sName = rtl::OUString::createFromAscii("page-name:");
862 			// MT IA2: Not used...
863 			// SdPage*	pCurrPge = pDrViewSh->getCurrentPage();
864 			SdDrawDocument* pDoc = pDrViewSh->GetDoc();
865 			sDisplay = pDrViewSh->getCurrentPage()->GetName();
866 			sDisplay.SearchAndReplace( String::CreateFromAscii( "\\" ), String::CreateFromAscii("\\\\" ));
867 			sDisplay.SearchAndReplace( String::CreateFromAscii( "=" ), String::CreateFromAscii("\\=" ) );
868 			sDisplay.SearchAndReplace( String::CreateFromAscii( ";" ), String::CreateFromAscii("\\;" ) );
869 			sDisplay.SearchAndReplace( String::CreateFromAscii( "," ), String::CreateFromAscii("\\," ) );
870 			sDisplay.SearchAndReplace( String::CreateFromAscii( ":" ), String::CreateFromAscii("\\:" ) );
871 			sValue = sName + sDisplay ;
872 			sName = rtl::OUString::createFromAscii(";page-number:");
873 			sValue += sName;
874 			sValue += String::CreateFromInt32((sal_Int16)((sal_uInt16)((pDrViewSh->getCurrentPage()->GetPageNum()-1)>>1) + 1)) ;
875 			sName = rtl::OUString::createFromAscii(";total-pages:");
876 			sValue += sName;
877 			sValue += String::CreateFromInt32(pDrViewSh->GetPageTabControl()->GetPageCount()) ;
878 			sValue +=  rtl::OUString::createFromAscii(";");
879 		if(pDrViewSh->IsLayerModeActive() )
880 		{
881 			sName = rtl::OUString::createFromAscii("page-name:");
882 			sValue = sName;
883 			sDisplay = pDrViewSh->GetLayerTabControl()->GetPageText(pDrViewSh->GetLayerTabControl()->GetCurPageId());
884 			if( pDoc )
885 			{
886 				SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin();
887 				SdrLayer* aSdrLayer = rLayerAdmin.GetLayer(sDisplay, sal_False);
888 				if( aSdrLayer )
889 				{
890 					String layerAltText = aSdrLayer->GetTitle();
891 					if(  layerAltText.Len() > 0)
892 					{
893 						sName = rtl::OUString::createFromAscii(" ");
894 						sDisplay = sDisplay + sName;
895 						sDisplay += layerAltText;
896 					}
897 				}
898 			}
899 			sDisplay.SearchAndReplace( String::CreateFromAscii( "\\" ), String::CreateFromAscii("\\\\" ));
900 			sDisplay.SearchAndReplace( String::CreateFromAscii( "=" ), String::CreateFromAscii("\\=" ));
901 			sDisplay.SearchAndReplace( String::CreateFromAscii( ";" ), String::CreateFromAscii("\\;" ));
902 			sDisplay.SearchAndReplace( String::CreateFromAscii( "," ), String::CreateFromAscii("\\," ));
903 			sDisplay.SearchAndReplace( String::CreateFromAscii( ":" ), String::CreateFromAscii("\\:" ));
904 			sValue +=  sDisplay;
905 			sName = rtl::OUString::createFromAscii(";page-number:");
906 			sValue += sName;
907 			sValue += String::CreateFromInt32(pDrViewSh->GetActiveTabLayerIndex()+1) ;
908 			sName = rtl::OUString::createFromAscii(";total-pages:");
909 			sValue += sName;
910 			sValue += String::CreateFromInt32(pDrViewSh->GetLayerTabControl()->GetPageCount()) ;
911 			sValue +=  rtl::OUString::createFromAscii(";");
912 		}
913 	}
914 	if (mpViewShell && mpViewShell->ISA(::sd::PresentationViewShell))
915 	{
916 		::sd::PresentationViewShell* pPresViewSh = (::sd::PresentationViewShell*) mpViewShell;
917 		SdPage*	pCurrPge = pPresViewSh->getCurrentPage();
918 		SdDrawDocument* pDoc = pPresViewSh->GetDoc();
919 		SdPage*	pNotesPge = (SdPage*)pDoc->GetSdPage((pCurrPge->GetPageNum()-1)>>1, PK_NOTES);
920 		if (pNotesPge)
921 		{
922 			SdrObject* pNotesObj = pNotesPge->GetPresObj(PRESOBJ_NOTES);
923 			if (pNotesObj)
924 			{
925 				OutlinerParaObject* pPara = pNotesObj->GetOutlinerParaObject();
926 				if (pPara)
927 				{
928 					sValue += rtl::OUString::createFromAscii("note:");
929 					const EditTextObject& rEdit = pPara->GetTextObject();
930 					for (sal_uInt16 i=0;i<rEdit.GetParagraphCount();i++)
931 					{
932 						String strNote = rEdit.GetText(i);
933 						strNote.SearchAndReplace( String::CreateFromAscii( "\\" ), String::CreateFromAscii("\\\\" ));
934 						strNote.SearchAndReplace( String::CreateFromAscii( "=" ), String::CreateFromAscii("\\=" ));
935 						strNote.SearchAndReplace( String::CreateFromAscii( ";" ), String::CreateFromAscii("\\;" ));
936 						strNote.SearchAndReplace( String::CreateFromAscii( "," ), String::CreateFromAscii("\\," ));
937 						strNote.SearchAndReplace( String::CreateFromAscii( ":" ), String::CreateFromAscii("\\:" ));
938 						sValue += rtl::OUString( strNote );
939 						sValue += rtl::OUString::createFromAscii(";");//to divide each paragraph
940 					}
941 				}
942 			}
943 		}
944 	}
945 	if (mpViewShell && mpViewShell->ISA(::sd::OutlineViewShell) )
946 	{
947 		rtl::OUString sName;
948 		String sDisplay;
949 		SdPage*	pCurrPge = mpViewShell->GetActualPage();
950 		SdDrawDocument* pDoc = mpViewShell->GetDoc();
951 		if(pCurrPge && pDoc)
952 		{
953 			sName = rtl::OUString::createFromAscii("page-name:");
954 			sDisplay = pCurrPge->GetName();
955 			sDisplay.SearchAndReplace( String::CreateFromAscii( "=" ), String::CreateFromAscii("\\=" ) );
956 			sDisplay.SearchAndReplace( String::CreateFromAscii( ";" ), String::CreateFromAscii("\\;" ) );
957 			sDisplay.SearchAndReplace( String::CreateFromAscii( "," ), String::CreateFromAscii("\\," ) );
958 			sDisplay.SearchAndReplace( String::CreateFromAscii( ":" ), String::CreateFromAscii("\\:" ) );
959 			sValue = sName + sDisplay ;
960 			sName = rtl::OUString::createFromAscii(";page-number:");
961 			sValue += sName;
962 			sValue += String::CreateFromInt32((sal_Int16)((sal_uInt16)((pCurrPge->GetPageNum()-1)>>1) + 1)) ;
963 			sName = rtl::OUString::createFromAscii(";total-pages:");
964 			sValue += sName;
965 			sValue += String::CreateFromInt32(pDoc->GetSdPageCount(PK_STANDARD)) ;
966 			sValue +=  rtl::OUString::createFromAscii(";");
967 		}
968 	}
969 	if (sValue.getLength())
970 		anyAtrribute <<= sValue;
971 	return anyAtrribute;
972 }
973 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >
get_AccFlowTo(const::com::sun::star::uno::Any &,sal_Int32)974 		SAL_CALL AccessibleDocumentViewBase::get_AccFlowTo(const ::com::sun::star::uno::Any&, sal_Int32 )
975 		throw ( ::com::sun::star::uno::RuntimeException )
976 {
977 	::com::sun::star::uno::Sequence< uno::Any> aRet;
978 
979 	return aRet;
980 }
981 
getForeground()982 sal_Int32 SAL_CALL AccessibleDocumentViewBase::getForeground(  )
983         throw (uno::RuntimeException)
984 {
985     return COL_BLACK;
986 }
987 
getBackground()988 sal_Int32 SAL_CALL AccessibleDocumentViewBase::getBackground(  )
989         throw (uno::RuntimeException)
990 {
991 	 ThrowIfDisposed ();
992     ::osl::MutexGuard aGuard (maMutex);
993     return mpViewShell->GetView()->getColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor;
994 }
995 } // end of namespace accessibility
996