1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
22 #include <sal/log.hxx>
23 #include <vcl/svapp.hxx>
25 #include <OutlineViewShell.hxx>
26 #include <DrawDocShell.hxx>
27 #include <OutlineView.hxx>
29 #include <AccessibleOutlineView.hxx>
30 #include <AccessibleOutlineEditSource.hxx>
31 #include <drawdoc.hxx>
32 #include <strings.hrc>
33 #include <sdresid.hxx>
37 using namespace ::com::sun::star
;
38 using namespace ::com::sun::star::accessibility
;
40 namespace accessibility
{
42 //===== internal ============================================================
44 AccessibleOutlineView::AccessibleOutlineView (
45 ::sd::Window
* pSdWindow
,
46 ::sd::OutlineViewShell
* pViewShell
,
47 const uno::Reference
<frame::XController
>& rxController
,
48 const uno::Reference
<XAccessible
>& rxParent
)
49 : AccessibleDocumentViewBase (pSdWindow
, pViewShell
, rxController
, rxParent
),
50 maTextHelper( ::std::unique_ptr
< SvxEditSource
>() )
52 SolarMutexGuard aGuard
;
54 // Beware! Here we leave the paths of the UNO API and descend into the
55 // depths of the core. Necessary for making the edit engine accessible.
59 ::sd::View
* pView
= pViewShell
->GetView();
61 if (dynamic_cast<const ::sd::OutlineView
* >( pView
) == nullptr)
64 OutlinerView
* pOutlineView
= static_cast< ::sd::OutlineView
*>(
65 pView
)->GetViewByWindow( pSdWindow
);
66 SdrOutliner
& rOutliner
=
67 static_cast< ::sd::OutlineView
*>(pView
)->GetOutliner();
71 maTextHelper
.SetEditSource( ::std::unique_ptr
< SvxEditSource
>( new AccessibleOutlineEditSource(
72 rOutliner
, *pView
, *pOutlineView
, *pSdWindow
) ) );
76 AccessibleOutlineView::~AccessibleOutlineView()
80 void AccessibleOutlineView::Init()
82 // Set event source _before_ starting to listen
83 maTextHelper
.SetEventSource(this);
85 AccessibleDocumentViewBase::Init ();
88 void AccessibleOutlineView::ViewForwarderChanged()
90 AccessibleDocumentViewBase::ViewForwarderChanged();
95 //===== XAccessibleContext ==================================================
98 AccessibleOutlineView::getAccessibleChildCount()
103 return maTextHelper
.GetChildCount();
106 uno::Reference
<XAccessible
> SAL_CALL
107 AccessibleOutlineView::getAccessibleChild (sal_Int32 nIndex
)
110 // Forward request to children manager.
111 return maTextHelper
.GetChild(nIndex
);
115 AccessibleOutlineView::getAccessibleName()
119 OUString sName
= SdResId(SID_SD_A11Y_D_PRESENTATION
);
120 ::sd::View
* pSdView
= static_cast< ::sd::View
* >( maShapeTreeInfo
.GetSdrView() );
123 SdDrawDocument
& rDoc
= pSdView
->GetDoc();
124 OUString sFileName
= rDoc
.getDocAccTitle();
125 if (sFileName
.isEmpty())
127 ::sd::DrawDocShell
* pDocSh
= pSdView
->GetDocSh();
130 sFileName
= pDocSh
->GetTitle( SFX_TITLE_APINAME
);
133 if (!sFileName
.isEmpty())
135 sName
= sFileName
+ " - " + sName
;
141 //===== XAccessibleEventBroadcaster ========================================
143 void SAL_CALL
AccessibleOutlineView::addAccessibleEventListener( const uno::Reference
< XAccessibleEventListener
>& xListener
)
145 // delegate listener handling to children manager.
147 maTextHelper
.AddEventListener(xListener
);
148 AccessibleContextBase::addEventListener(xListener
);
151 void SAL_CALL
AccessibleOutlineView::removeAccessibleEventListener( const uno::Reference
< XAccessibleEventListener
>& xListener
)
155 maTextHelper
.RemoveEventListener(xListener
);
156 AccessibleContextBase::removeEventListener(xListener
);
162 AccessibleOutlineView::getImplementationName()
164 return "AccessibleOutlineView";
167 //===== XEventListener ======================================================
169 //===== protected internal ==================================================
171 void AccessibleOutlineView::Activated()
173 SolarMutexGuard aGuard
;
175 // delegate listener handling to children manager.
176 maTextHelper
.SetFocus();
179 void AccessibleOutlineView::Deactivated()
181 SolarMutexGuard aGuard
;
183 // delegate listener handling to children manager.
184 maTextHelper
.SetFocus(false);
187 void SAL_CALL
AccessibleOutlineView::disposing()
190 maTextHelper
.Dispose();
192 AccessibleDocumentViewBase::disposing ();
195 //===== XPropertyChangeListener =============================================
198 AccessibleOutlineView::propertyChange (const beans::PropertyChangeEvent
& rEventObject
)
202 AccessibleDocumentViewBase::propertyChange (rEventObject
);
204 //add page switch event for slide show mode
205 if (rEventObject
.PropertyName
== "CurrentPage" ||
206 rEventObject
.PropertyName
== "PageChange")
208 // The current page changed. Update the children accordingly.
210 CommitChange(AccessibleEventId::PAGE_CHANGED
,rEventObject
.NewValue
, rEventObject
.OldValue
);
212 else if ( rEventObject
.PropertyName
== "VisibleArea" )
214 // The visible area changed. Update the children accordingly.
219 SAL_INFO("sd", "unhandled");
223 /// Create a name for this view.
225 AccessibleOutlineView::CreateAccessibleName()
227 SolarMutexGuard aGuard
;
229 return SdResId(SID_SD_A11Y_I_OUTLINEVIEW_N
);
232 void AccessibleOutlineView::UpdateChildren()
234 SolarMutexGuard aGuard
;
236 // Update visible children
237 maTextHelper
.UpdateChildren();
240 } // end of namespace accessibility
242 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */