summaryrefslogtreecommitdiff
path: root/sd/source/ui/accessibility/AccessibleOutlineView.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/accessibility/AccessibleOutlineView.cxx')
-rw-r--r--sd/source/ui/accessibility/AccessibleOutlineView.cxx288
1 files changed, 288 insertions, 0 deletions
diff --git a/sd/source/ui/accessibility/AccessibleOutlineView.cxx b/sd/source/ui/accessibility/AccessibleOutlineView.cxx
new file mode 100644
index 000000000000..f61e09d743f7
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleOutlineView.cxx
@@ -0,0 +1,288 @@
+/*************************************************************************
+ *
+ * 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 <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>
+#ifndef _COM_SUN_STAR_ACCESSIBLE_ACCESSIBLEEVENTID_HPP_
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#endif
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#ifndef _COM_SUN_STAR_LANG_XMULSTISERVICEFACTORY_HPP_
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#endif
+#include <rtl/ustring.h>
+#ifndef _SFXFRAME_HXX
+#include<sfx2/viewfrm.hxx>
+#endif
+
+#include <svx/AccessibleShape.hxx>
+
+#include <svx/svdobj.hxx>
+#include <svx/svdmodel.hxx>
+#include <svx/unoapi.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <vcl/svapp.hxx>
+#include "Window.hxx"
+#include "ViewShell.hxx"
+#include "OutlineViewShell.hxx"
+#include "View.hxx"
+#include "AccessibleOutlineView.hxx"
+#include "AccessibleOutlineEditSource.hxx"
+
+#include <memory>
+
+#include "accessibility.hrc"
+#include "sdresid.hxx"
+#include <vos/mutex.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+
+namespace accessibility {
+
+
+//===== internal ============================================================
+
+AccessibleOutlineView::AccessibleOutlineView (
+ ::sd::Window* pSdWindow,
+ ::sd::OutlineViewShell* pViewShell,
+ const uno::Reference<frame::XController>& rxController,
+ const uno::Reference<XAccessible>& rxParent)
+ : AccessibleDocumentViewBase (pSdWindow, pViewShell, rxController, rxParent),
+ maTextHelper( ::std::auto_ptr< SvxEditSource >( NULL ) )
+{
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ // Beware! Here we leave the paths of the UNO API and descend into the
+ // depths of the core. Necessary for making the edit engine accessible.
+ if( pViewShell && pSdWindow )
+ {
+ ::sd::View* pView = pViewShell->GetView();
+
+ if (pView && pView->ISA(::sd::OutlineView))
+ {
+ OutlinerView* pOutlineView = static_cast< ::sd::OutlineView*>(
+ pView)->GetViewByWindow( pSdWindow );
+ SdrOutliner* pOutliner =
+ static_cast< ::sd::OutlineView*>(pView)->GetOutliner();
+
+ if( pOutlineView && pOutliner )
+ {
+ maTextHelper.SetEditSource( ::std::auto_ptr< SvxEditSource >( new AccessibleOutlineEditSource(
+ *pOutliner, *pView, *pOutlineView, *pSdWindow ) ) );
+ }
+ }
+ }
+}
+
+
+AccessibleOutlineView::~AccessibleOutlineView (void)
+{
+ OSL_TRACE ("~AccessibleOutlineView");
+}
+
+
+void AccessibleOutlineView::Init (void)
+{
+ // #105479# Set event source _before_ starting to listen
+ maTextHelper.SetEventSource(this);
+
+ AccessibleDocumentViewBase::Init ();
+}
+
+
+void AccessibleOutlineView::ViewForwarderChanged (ChangeType aChangeType,
+ const IAccessibleViewForwarder* pViewForwarder)
+{
+ AccessibleDocumentViewBase::ViewForwarderChanged (aChangeType, pViewForwarder);
+
+ UpdateChildren();
+}
+
+
+//===== XAccessibleContext ==================================================
+
+sal_Int32 SAL_CALL
+ AccessibleOutlineView::getAccessibleChildCount (void)
+ throw (uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ // forward
+ return maTextHelper.GetChildCount();
+}
+
+
+uno::Reference<XAccessible> SAL_CALL
+ AccessibleOutlineView::getAccessibleChild (sal_Int32 nIndex)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+ // Forward request to children manager.
+ return maTextHelper.GetChild(nIndex);
+}
+
+//===== XAccessibleEventBroadcaster ========================================
+
+void SAL_CALL AccessibleOutlineView::addEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) throw (uno::RuntimeException)
+{
+ // delegate listener handling to children manager.
+ if ( ! IsDisposed())
+ maTextHelper.AddEventListener(xListener);
+}
+
+void SAL_CALL AccessibleOutlineView::removeEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) throw (uno::RuntimeException)
+{
+ // forward
+ if ( ! IsDisposed())
+ maTextHelper.RemoveEventListener(xListener);
+}
+
+//===== XServiceInfo ========================================================
+
+::rtl::OUString SAL_CALL
+ AccessibleOutlineView::getImplementationName (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AccessibleOutlineView"));
+}
+
+
+//===== XEventListener ======================================================
+
+void SAL_CALL
+ AccessibleOutlineView::disposing (const lang::EventObject& rEventObject)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ AccessibleDocumentViewBase::disposing (rEventObject);
+}
+
+//===== protected internal ==================================================
+
+void AccessibleOutlineView::FireEvent(const AccessibleEventObject& aEvent )
+{
+ // delegate listener handling to children manager.
+ maTextHelper.FireEvent(aEvent);
+}
+
+void AccessibleOutlineView::Activated (void)
+{
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ // delegate listener handling to children manager.
+ maTextHelper.SetFocus(sal_True);
+}
+
+void AccessibleOutlineView::Deactivated (void)
+{
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ // delegate listener handling to children manager.
+ maTextHelper.SetFocus(sal_False);
+}
+
+void SAL_CALL AccessibleOutlineView::disposing (void)
+{
+ // dispose children
+ maTextHelper.Dispose();
+
+ AccessibleDocumentViewBase::disposing ();
+}
+
+//===== XPropertyChangeListener =============================================
+
+void SAL_CALL
+ AccessibleOutlineView::propertyChange (const beans::PropertyChangeEvent& rEventObject)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ThrowIfDisposed ();
+
+ AccessibleDocumentViewBase::propertyChange (rEventObject);
+
+ OSL_TRACE ("AccessibleOutlineView::propertyChange");
+ if (rEventObject.PropertyName == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("CurrentPage")))
+ {
+ OSL_TRACE (" current page changed");
+
+ // The current page changed. Update the children accordingly.
+ UpdateChildren();
+ }
+ else if (rEventObject.PropertyName == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("VisibleArea")))
+ {
+ OSL_TRACE (" visible area changed");
+
+ // The visible area changed. Update the children accordingly.
+ UpdateChildren();
+ }
+ else
+ {
+ OSL_TRACE (" unhandled");
+ }
+ OSL_TRACE (" done");
+}
+
+
+/// Create a name for this view.
+::rtl::OUString
+ AccessibleOutlineView::CreateAccessibleName (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ return String( SdResId(SID_SD_A11Y_I_OUTLINEVIEW_N) );
+}
+
+
+/** Create a description for this view. Use the model's description or URL
+ if a description is not available.
+*/
+::rtl::OUString
+ AccessibleOutlineView::CreateAccessibleDescription (void)
+ throw (::com::sun::star::uno::RuntimeException)
+{
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ return String( SdResId(SID_SD_A11Y_I_OUTLINEVIEW_D) );
+}
+
+void AccessibleOutlineView::UpdateChildren()
+{
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ // Update visible children
+ maTextHelper.UpdateChildren();
+}
+
+} // end of namespace accessibility