summaryrefslogtreecommitdiff
path: root/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx')
-rw-r--r--sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx842
1 files changed, 842 insertions, 0 deletions
diff --git a/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx b/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx
new file mode 100644
index 000000000000..034a0bc5e863
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx
@@ -0,0 +1,842 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sd.hxx"
+#include "AccessibleDocumentViewBase.hxx"
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/document/XEventBroadcaster.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <rtl/ustring.h>
+#include<sfx2/viewfrm.hxx>
+
+#include <svx/AccessibleShape.hxx>
+
+#include <svx/svdobj.hxx>
+#include <svx/svdmodel.hxx>
+#include <svx/unoapi.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include "Window.hxx"
+#include <vcl/svapp.hxx>
+
+
+#include "ViewShell.hxx"
+#include "View.hxx"
+#include <memory>
+
+using ::rtl::OUString;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+using ::com::sun::star::uno::Reference;
+
+class SfxViewFrame;
+
+namespace accessibility {
+
+//===== internal ============================================================
+AccessibleDocumentViewBase::AccessibleDocumentViewBase (
+ ::sd::Window* pSdWindow,
+ ::sd::ViewShell* pViewShell,
+ const uno::Reference<frame::XController>& rxController,
+ const uno::Reference<XAccessible>& rxParent)
+ : AccessibleContextBase (rxParent, AccessibleRole::DOCUMENT),
+ mpWindow (pSdWindow),
+ mxController (rxController),
+ mxModel (NULL),
+ maViewForwarder (
+ static_cast<SdrPaintView*>(pViewShell->GetView()),
+ *static_cast<OutputDevice*>(pSdWindow))
+{
+ if (mxController.is())
+ mxModel = mxController->getModel();
+
+ // Fill the shape tree info.
+ maShapeTreeInfo.SetModelBroadcaster (
+ uno::Reference<document::XEventBroadcaster>(
+ mxModel, uno::UNO_QUERY));
+ maShapeTreeInfo.SetController (mxController);
+ maShapeTreeInfo.SetSdrView (pViewShell->GetView());
+ maShapeTreeInfo.SetWindow (pSdWindow);
+ maShapeTreeInfo.SetViewForwarder (&maViewForwarder);
+
+ mxWindow = ::VCLUnoHelper::GetInterface (pSdWindow);
+}
+
+
+
+
+AccessibleDocumentViewBase::~AccessibleDocumentViewBase (void)
+{
+ // At this place we should be disposed. You may want to add a
+ // corresponding assertion into the destructor of a derived class.
+}
+
+
+
+
+void AccessibleDocumentViewBase::Init (void)
+{
+ // Finish the initialization of the shape tree info container.
+ maShapeTreeInfo.SetDocumentWindow (this);
+
+ // Register as window listener to stay up to date with its size and
+ // position.
+ mxWindow->addWindowListener (this);
+ // Register as focus listener to
+ mxWindow->addFocusListener (this);
+
+ // Determine the list of shapes on the current page.
+ uno::Reference<drawing::XShapes> xShapeList;
+ uno::Reference<drawing::XDrawView> xView (mxController, uno::UNO_QUERY);
+ if (xView.is())
+ xShapeList = uno::Reference<drawing::XShapes> (
+ xView->getCurrentPage(), uno::UNO_QUERY);
+
+ // Register this object as dispose event listener at the model.
+ if (mxModel.is())
+ mxModel->addEventListener (
+ static_cast<awt::XWindowListener*>(this));
+
+ // Register as property change listener at the controller.
+ uno::Reference<beans::XPropertySet> xSet (mxController, uno::UNO_QUERY);
+ if (xSet.is())
+ xSet->addPropertyChangeListener (
+ OUString (RTL_CONSTASCII_USTRINGPARAM("")),
+ static_cast<beans::XPropertyChangeListener*>(this));
+
+ // Register this object as dispose event listener at the controller.
+ if (mxController.is())
+ mxController->addEventListener (
+ static_cast<awt::XWindowListener*>(this));
+
+ // Register at VCL Window to be informed of activated and deactivated
+ // OLE objects.
+ Window* pWindow = maShapeTreeInfo.GetWindow();
+ if (pWindow != NULL)
+ {
+ maWindowLink = LINK(
+ this, AccessibleDocumentViewBase, WindowChildEventListener);
+
+ pWindow->AddChildEventListener (maWindowLink);
+
+ USHORT nCount = pWindow->GetChildCount();
+ for (sal_uInt16 i=0; i<nCount; i++)
+ {
+ Window* pChildWindow = pWindow->GetChild (i);
+ if (pChildWindow &&
+ (AccessibleRole::EMBEDDED_OBJECT
+ ==pChildWindow->GetAccessibleRole()))
+ {
+ SetAccessibleOLEObject (pChildWindow->GetAccessible());
+ }
+ }
+ }
+}
+
+
+
+
+IMPL_LINK(AccessibleDocumentViewBase, WindowChildEventListener,
+ VclSimpleEvent*, pEvent)
+{
+ OSL_ASSERT(pEvent!=NULL && pEvent->ISA(VclWindowEvent));
+ if (pEvent!=NULL && pEvent->ISA(VclWindowEvent))
+ {
+ VclWindowEvent* pWindowEvent = static_cast<VclWindowEvent*>(pEvent);
+ // DBG_ASSERT( pVclEvent->GetWindow(), "Window???" );
+ switch (pWindowEvent->GetId())
+ {
+ case VCLEVENT_OBJECT_DYING:
+ {
+ // Window is dying. Unregister from VCL Window.
+ // This is also attempted in the disposing() method.
+ Window* pWindow = maShapeTreeInfo.GetWindow();
+ Window* pDyingWindow = static_cast<Window*>(
+ pWindowEvent->GetWindow());
+ if (pWindow==pDyingWindow && pWindow!=NULL && maWindowLink.IsSet())
+ {
+ pWindow->RemoveChildEventListener (maWindowLink);
+ maWindowLink = Link();
+ }
+ }
+ break;
+
+ case VCLEVENT_WINDOW_SHOW:
+ {
+ // A new window has been created. Is it an OLE object?
+ Window* pChildWindow = static_cast<Window*>(
+ pWindowEvent->GetData());
+ if (pChildWindow!=NULL
+ && (pChildWindow->GetAccessibleRole()
+ == AccessibleRole::EMBEDDED_OBJECT))
+ {
+ SetAccessibleOLEObject (pChildWindow->GetAccessible());
+ }
+ }
+ break;
+
+ case VCLEVENT_WINDOW_HIDE:
+ {
+ // A window has been destroyed. Has that been an OLE
+ // object?
+ Window* pChildWindow = static_cast<Window*>(
+ pWindowEvent->GetData());
+ if (pChildWindow!=NULL
+ && (pChildWindow->GetAccessibleRole()
+ == AccessibleRole::EMBEDDED_OBJECT))
+ {
+ SetAccessibleOLEObject (NULL);
+ }
+ }
+ break;
+ }
+ }
+
+ return 0;
+}
+
+
+
+
+//===== IAccessibleViewForwarderListener ====================================
+
+void AccessibleDocumentViewBase::ViewForwarderChanged(ChangeType, const IAccessibleViewForwarder* )
+{
+ // Empty
+}
+
+
+
+
+//===== XAccessibleContext ==================================================
+
+Reference<XAccessible> SAL_CALL
+ AccessibleDocumentViewBase::getAccessibleParent (void)
+ throw (uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ return AccessibleContextBase::getAccessibleParent();
+}
+
+
+
+sal_Int32 SAL_CALL
+ AccessibleDocumentViewBase::getAccessibleChildCount (void)
+ throw (uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ if (mxAccessibleOLEObject.is())
+ return 1;
+ else
+ return 0;
+}
+
+
+
+
+Reference<XAccessible> SAL_CALL
+ AccessibleDocumentViewBase::getAccessibleChild (sal_Int32 nIndex)
+ throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
+{
+ ThrowIfDisposed ();
+
+ ::osl::MutexGuard aGuard (maMutex);
+ if (mxAccessibleOLEObject.is())
+ if (nIndex == 0)
+ return mxAccessibleOLEObject;
+
+ throw lang::IndexOutOfBoundsException (
+ ::rtl::OUString::createFromAscii ("no child with index ")
+ + rtl::OUString::valueOf(nIndex),
+ NULL);
+}
+
+
+
+
+//===== XAccessibleComponent ================================================
+
+/** Iterate over all children and test whether the specified point lies
+ within one of their bounding boxes. Return the first child for which
+ this is true.
+*/
+uno::Reference<XAccessible > SAL_CALL
+ AccessibleDocumentViewBase::getAccessibleAtPoint (
+ const awt::Point& aPoint)
+ throw (uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ ::osl::MutexGuard aGuard (maMutex);
+ uno::Reference<XAccessible> xChildAtPosition;
+
+ sal_Int32 nChildCount = getAccessibleChildCount ();
+ for (sal_Int32 i=nChildCount-1; i>=0; --i)
+ {
+ Reference<XAccessible> xChild (getAccessibleChild (i));
+ if (xChild.is())
+ {
+ Reference<XAccessibleComponent> xChildComponent (
+ xChild->getAccessibleContext(), uno::UNO_QUERY);
+ if (xChildComponent.is())
+ {
+ awt::Rectangle aBBox (xChildComponent->getBounds());
+ if ( (aPoint.X >= aBBox.X)
+ && (aPoint.Y >= aBBox.Y)
+ && (aPoint.X < aBBox.X+aBBox.Width)
+ && (aPoint.Y < aBBox.Y+aBBox.Height) )
+ {
+ xChildAtPosition = xChild;
+ break;
+ }
+ }
+ }
+ }
+
+ // Have not found a child under the given point. Returning empty
+ // reference to indicate this.
+ return xChildAtPosition;
+}
+
+
+
+
+awt::Rectangle SAL_CALL
+ AccessibleDocumentViewBase::getBounds (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ // Transform visible area into screen coordinates.
+ ::Rectangle aVisibleArea (
+ maShapeTreeInfo.GetViewForwarder()->GetVisibleArea());
+ ::Point aPixelTopLeft (
+ maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ aVisibleArea.TopLeft()));
+ ::Point aPixelSize (
+ maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ aVisibleArea.BottomRight())
+ - aPixelTopLeft);
+
+ // Prepare to subtract the parent position to transform into relative
+ // coordinates.
+ awt::Point aParentPosition;
+ Reference<XAccessible> xParent = getAccessibleParent ();
+ if (xParent.is())
+ {
+ Reference<XAccessibleComponent> xParentComponent (
+ xParent->getAccessibleContext(), uno::UNO_QUERY);
+ if (xParentComponent.is())
+ aParentPosition = xParentComponent->getLocationOnScreen();
+ }
+
+ return awt::Rectangle (
+ aPixelTopLeft.X() - aParentPosition.X,
+ aPixelTopLeft.Y() - aParentPosition.Y,
+ aPixelSize.X(),
+ aPixelSize.Y());
+}
+
+
+
+
+awt::Point SAL_CALL
+ AccessibleDocumentViewBase::getLocation (void)
+ throw (uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+ awt::Rectangle aBoundingBox (getBounds());
+ return awt::Point (aBoundingBox.X, aBoundingBox.Y);
+}
+
+
+
+
+awt::Point SAL_CALL
+ AccessibleDocumentViewBase::getLocationOnScreen (void)
+ throw (uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+ ::Point aLogicalPoint (maShapeTreeInfo.GetViewForwarder()->GetVisibleArea().TopLeft());
+ ::Point aPixelPoint (maShapeTreeInfo.GetViewForwarder()->LogicToPixel (aLogicalPoint));
+ return awt::Point (aPixelPoint.X(), aPixelPoint.Y());
+}
+
+
+
+
+awt::Size SAL_CALL
+ AccessibleDocumentViewBase::getSize (void)
+ throw (uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ // Transform visible area into screen coordinates.
+ ::Rectangle aVisibleArea (
+ maShapeTreeInfo.GetViewForwarder()->GetVisibleArea());
+ ::Point aPixelTopLeft (
+ maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ aVisibleArea.TopLeft()));
+ ::Point aPixelSize (
+ maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ aVisibleArea.BottomRight())
+ - aPixelTopLeft);
+
+ return awt::Size (aPixelSize.X(), aPixelSize.Y());
+}
+
+
+
+
+//===== XInterface ==========================================================
+
+uno::Any SAL_CALL
+ AccessibleDocumentViewBase::queryInterface (const uno::Type & rType)
+ throw (uno::RuntimeException)
+{
+ uno::Any aReturn = AccessibleContextBase::queryInterface (rType);
+ if ( ! aReturn.hasValue())
+ aReturn = ::cppu::queryInterface (rType,
+ static_cast<XAccessibleComponent*>(this),
+ static_cast<XAccessibleSelection*>(this),
+ static_cast<lang::XEventListener*>(
+ static_cast<awt::XWindowListener*>(this)),
+ static_cast<beans::XPropertyChangeListener*>(this),
+ static_cast<awt::XWindowListener*>(this),
+ static_cast<awt::XFocusListener*>(this)
+ );
+ return aReturn;
+}
+
+
+
+
+void SAL_CALL
+ AccessibleDocumentViewBase::acquire (void)
+ throw ()
+{
+ AccessibleContextBase::acquire ();
+}
+
+
+
+
+void SAL_CALL
+ AccessibleDocumentViewBase::release (void)
+ throw ()
+{
+ AccessibleContextBase::release ();
+}
+
+
+
+
+//===== XServiceInfo ========================================================
+
+::rtl::OUString SAL_CALL
+ AccessibleDocumentViewBase::getImplementationName (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AccessibleDocumentViewBase"));
+}
+
+
+
+
+::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL
+ AccessibleDocumentViewBase::getSupportedServiceNames (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+ return AccessibleContextBase::getSupportedServiceNames ();
+}
+
+
+
+
+
+//===== XTypeProvider =======================================================
+
+::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> SAL_CALL
+ AccessibleDocumentViewBase::getTypes (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ // Get list of types from the context base implementation, ...
+ uno::Sequence<uno::Type> aTypeList (AccessibleContextBase::getTypes());
+ // ... get list of types from component base implementation, ...
+ uno::Sequence<uno::Type> aComponentTypeList (AccessibleComponentBase::getTypes());
+
+
+ // ...and add the additional type for the component, ...
+ const uno::Type aLangEventListenerType =
+ ::getCppuType((const uno::Reference<lang::XEventListener>*)0);
+ const uno::Type aPropertyChangeListenerType =
+ ::getCppuType((const uno::Reference<beans::XPropertyChangeListener>*)0);
+ const uno::Type aWindowListenerType =
+ ::getCppuType((const uno::Reference<awt::XWindowListener>*)0);
+ const uno::Type aFocusListenerType =
+ ::getCppuType((const uno::Reference<awt::XFocusListener>*)0);
+ const uno::Type aEventBroadcaster =
+ ::getCppuType((const uno::Reference<XAccessibleEventBroadcaster>*)0);
+
+ // ... and merge them all into one list.
+ sal_Int32 nTypeCount (aTypeList.getLength()),
+ nComponentTypeCount (aComponentTypeList.getLength()),
+ i;
+
+ aTypeList.realloc (nTypeCount + nComponentTypeCount + 5);
+
+ for (i=0; i<nComponentTypeCount; i++)
+ aTypeList[nTypeCount + i] = aComponentTypeList[i];
+
+ aTypeList[nTypeCount + i++ ] = aLangEventListenerType;
+ aTypeList[nTypeCount + i++] = aPropertyChangeListenerType;
+ aTypeList[nTypeCount + i++] = aWindowListenerType;
+ aTypeList[nTypeCount + i++] = aFocusListenerType;
+ aTypeList[nTypeCount + i++] = aEventBroadcaster;
+
+ return aTypeList;
+}
+
+
+
+
+void AccessibleDocumentViewBase::impl_dispose()
+{
+ // Unregister from VCL Window.
+ Window* pWindow = maShapeTreeInfo.GetWindow();
+ if (maWindowLink.IsSet())
+ {
+ if (pWindow)
+ pWindow->RemoveChildEventListener (maWindowLink);
+ maWindowLink = Link();
+ }
+ else
+ {
+ DBG_ASSERT (pWindow, "AccessibleDocumentViewBase::disposing");
+ }
+
+ // Unregister from window.
+ if (mxWindow.is())
+ {
+ mxWindow->removeWindowListener (this);
+ mxWindow->removeFocusListener (this);
+ mxWindow = NULL;
+ }
+
+ // Unregister form the model.
+ if (mxModel.is())
+ mxModel->removeEventListener (
+ static_cast<awt::XWindowListener*>(this));
+
+ // Unregister from the controller.
+ if (mxController.is())
+ {
+ uno::Reference<beans::XPropertySet> xSet (mxController, uno::UNO_QUERY);
+ if (xSet.is())
+ xSet->removePropertyChangeListener (
+ OUString (RTL_CONSTASCII_USTRINGPARAM("")),
+ static_cast<beans::XPropertyChangeListener*>(this));
+
+ mxController->removeEventListener (
+ static_cast<awt::XWindowListener*>(this));
+ }
+
+ // Propagate change of controller down the shape tree.
+ maShapeTreeInfo.SetControllerBroadcaster (NULL);
+
+ // Reset the model reference.
+ mxModel = NULL;
+ // Reset the model reference.
+ mxController = NULL;
+
+ maShapeTreeInfo.SetDocumentWindow (NULL);
+}
+
+
+
+
+//===== XEventListener ======================================================
+
+void SAL_CALL
+ AccessibleDocumentViewBase::disposing (const lang::EventObject& rEventObject)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ // Register this object as dispose event and document::XEventListener
+ // listener at the model.
+
+ if ( ! rEventObject.Source.is())
+ {
+ // Paranoia. Can this really happen?
+ }
+ else if (rEventObject.Source == mxModel || rEventObject.Source == mxController)
+ {
+ impl_dispose();
+ }
+}
+
+//===== XPropertyChangeListener =============================================
+
+void SAL_CALL AccessibleDocumentViewBase::propertyChange (const beans::PropertyChangeEvent& )
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ // Empty
+}
+
+
+
+
+//===== XWindowListener =====================================================
+
+void SAL_CALL
+ AccessibleDocumentViewBase::windowResized (const ::com::sun::star::awt::WindowEvent& )
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ if( IsDisposed() )
+ return;
+
+ ViewForwarderChanged (
+ IAccessibleViewForwarderListener::VISIBLE_AREA,
+ &maViewForwarder);
+}
+
+
+
+
+void SAL_CALL
+ AccessibleDocumentViewBase::windowMoved (const ::com::sun::star::awt::WindowEvent& )
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ if( IsDisposed() )
+ return;
+
+ ViewForwarderChanged (
+ IAccessibleViewForwarderListener::VISIBLE_AREA,
+ &maViewForwarder);
+}
+
+
+
+
+void SAL_CALL
+ AccessibleDocumentViewBase::windowShown (const ::com::sun::star::lang::EventObject& )
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ if( IsDisposed() )
+ return;
+
+ ViewForwarderChanged (
+ IAccessibleViewForwarderListener::VISIBLE_AREA,
+ &maViewForwarder);
+}
+
+
+
+
+void SAL_CALL
+ AccessibleDocumentViewBase::windowHidden (const ::com::sun::star::lang::EventObject& )
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ if( IsDisposed() )
+ return;
+
+ ViewForwarderChanged (
+ IAccessibleViewForwarderListener::VISIBLE_AREA,
+ &maViewForwarder);
+}
+
+
+
+
+//===== XFocusListener ==================================================
+
+void AccessibleDocumentViewBase::focusGained (const ::com::sun::star::awt::FocusEvent& e)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+ if (e.Source == mxWindow)
+ Activated ();
+}
+
+void AccessibleDocumentViewBase::focusLost (const ::com::sun::star::awt::FocusEvent& e)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+ if (e.Source == mxWindow)
+ Deactivated ();
+}
+
+
+
+
+//===== protected internal ==================================================
+
+// This method is called from the component helper base class while disposing.
+void SAL_CALL AccessibleDocumentViewBase::disposing (void)
+{
+ impl_dispose();
+
+ AccessibleContextBase::disposing ();
+}
+
+
+
+
+/// Create a name for this view.
+::rtl::OUString
+ AccessibleDocumentViewBase::CreateAccessibleName (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ return ::rtl::OUString (
+ RTL_CONSTASCII_USTRINGPARAM("AccessibleDocumentViewBase"));
+}
+
+
+
+
+/** Create a description for this view. Use the model's description or URL
+ if a description is not available.
+*/
+::rtl::OUString
+ AccessibleDocumentViewBase::CreateAccessibleDescription (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ rtl::OUString sDescription;
+
+ uno::Reference<lang::XServiceInfo> xInfo (mxController, uno::UNO_QUERY);
+ if (xInfo.is())
+ {
+ OUString sFirstService = xInfo->getSupportedServiceNames()[0];
+ if (sFirstService == OUString (
+ RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DrawingDocumentDrawView")))
+ {
+ sDescription = OUString (RTL_CONSTASCII_USTRINGPARAM("Draw Document"));
+ }
+ else
+ sDescription = sFirstService;
+ }
+ else
+ sDescription = OUString (
+ RTL_CONSTASCII_USTRINGPARAM("Accessible Draw Document"));
+ return sDescription;
+}
+
+
+
+
+void AccessibleDocumentViewBase::Activated (void)
+{
+ // Empty. Overwrite to do something usefull.
+}
+
+
+
+
+void AccessibleDocumentViewBase::Deactivated (void)
+{
+ // Empty. Overwrite to do something usefull.
+}
+
+
+
+
+void AccessibleDocumentViewBase::SetAccessibleOLEObject (
+ const Reference <XAccessible>& xOLEObject)
+{
+ // Send child event about removed accessible OLE object if necessary.
+ if (mxAccessibleOLEObject != xOLEObject)
+ if (mxAccessibleOLEObject.is())
+ CommitChange (
+ AccessibleEventId::CHILD,
+ uno::Any(),
+ uno::makeAny (mxAccessibleOLEObject));
+
+ // Assume that the accessible OLE Object disposes itself correctly.
+
+ {
+ ::osl::MutexGuard aGuard (maMutex);
+ mxAccessibleOLEObject = xOLEObject;
+ }
+
+ // Send child event about new accessible OLE object if necessary.
+ if (mxAccessibleOLEObject.is())
+ CommitChange (
+ AccessibleEventId::CHILD,
+ uno::makeAny (mxAccessibleOLEObject),
+ uno::Any());
+}
+
+
+
+
+//===== methods from AccessibleSelectionBase ==================================================
+
+// return the member maMutex;
+::osl::Mutex&
+ AccessibleDocumentViewBase::implGetMutex()
+{
+ return( maMutex );
+}
+
+// return ourself as context in default case
+uno::Reference< XAccessibleContext >
+ AccessibleDocumentViewBase::implGetAccessibleContext()
+ throw (uno::RuntimeException)
+{
+ return( this );
+}
+
+// return sal_False in default case
+sal_Bool
+ AccessibleDocumentViewBase::implIsSelected( sal_Int32 )
+ throw (uno::RuntimeException)
+{
+ return( sal_False );
+}
+
+// return nothing in default case
+void
+ AccessibleDocumentViewBase::implSelect( sal_Int32, sal_Bool )
+ throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
+{
+}
+
+} // end of namespace accessibility