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 <com/sun/star/drawing/XDrawPage.hpp>
27 #include <com/sun/star/drawing/XDrawView.hpp>
28 #include <com/sun/star/drawing/XShapes.hpp>
29 #include <com/sun/star/container/XChild.hpp>
30 #include <com/sun/star/frame/XController.hpp>
31 #include <com/sun/star/frame/XFrame.hpp>
32 #include <com/sun/star/document/XEventBroadcaster.hpp>
33 #include <com/sun/star/beans/XPropertySet.hpp>
34 #ifndef _COM_SUN_STAR_ACCESSIBLE_ACCESSIBLEEVENTID_HPP_
35 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
36 #endif
37 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
38 #ifndef _COM_SUN_STAR_LANG_XMULSTISERVICEFACTORY_HPP_
39 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
40 #endif
41 #include <rtl/ustring.h>
42 #ifndef _SFXFRAME_HXX
43 #include<sfx2/viewfrm.hxx>
44 #endif
45
46 #include <svx/AccessibleShape.hxx>
47
48 #include <svx/svdobj.hxx>
49 #include <svx/svdmodel.hxx>
50 #include <svx/unoapi.hxx>
51 #include <toolkit/helper/vclunohelper.hxx>
52 #include <vcl/svapp.hxx>
53 #include "Window.hxx"
54 #include "ViewShell.hxx"
55 #include "OutlineViewShell.hxx"
56 #include "View.hxx"
57 #include "AccessibleOutlineView.hxx"
58 #include "AccessibleOutlineEditSource.hxx"
59
60 #include <memory>
61
62 #include "accessibility.hrc"
63 #include "sdresid.hxx"
64 #include <vos/mutex.hxx>
65
66 using namespace ::com::sun::star;
67 using namespace ::com::sun::star::accessibility;
68
69 namespace accessibility {
70
71
72 //===== internal ============================================================
73
AccessibleOutlineView(::sd::Window * pSdWindow,::sd::OutlineViewShell * pViewShell,const uno::Reference<frame::XController> & rxController,const uno::Reference<XAccessible> & rxParent)74 AccessibleOutlineView::AccessibleOutlineView (
75 ::sd::Window* pSdWindow,
76 ::sd::OutlineViewShell* pViewShell,
77 const uno::Reference<frame::XController>& rxController,
78 const uno::Reference<XAccessible>& rxParent)
79 : AccessibleDocumentViewBase (pSdWindow, pViewShell, rxController, rxParent),
80 maTextHelper( ::std::auto_ptr< SvxEditSource >( NULL ) )
81 {
82 ::vos::OGuard aGuard( Application::GetSolarMutex() );
83
84 // Beware! Here we leave the paths of the UNO API and descend into the
85 // depths of the core. Necessary for making the edit engine accessible.
86 if( pViewShell && pSdWindow )
87 {
88 ::sd::View* pView = pViewShell->GetView();
89
90 if (pView && pView->ISA(::sd::OutlineView))
91 {
92 OutlinerView* pOutlineView = static_cast< ::sd::OutlineView*>(
93 pView)->GetViewByWindow( pSdWindow );
94 SdrOutliner* pOutliner =
95 static_cast< ::sd::OutlineView*>(pView)->GetOutliner();
96
97 if( pOutlineView && pOutliner )
98 {
99 maTextHelper.SetEditSource( ::std::auto_ptr< SvxEditSource >( new AccessibleOutlineEditSource(
100 *pOutliner, *pView, *pOutlineView, *pSdWindow ) ) );
101 }
102 }
103 }
104 }
105
106
~AccessibleOutlineView(void)107 AccessibleOutlineView::~AccessibleOutlineView (void)
108 {
109 OSL_TRACE ("~AccessibleOutlineView");
110 }
111
112
Init(void)113 void AccessibleOutlineView::Init (void)
114 {
115 // #105479# Set event source _before_ starting to listen
116 maTextHelper.SetEventSource(this);
117
118 AccessibleDocumentViewBase::Init ();
119 }
120
121
ViewForwarderChanged(ChangeType aChangeType,const IAccessibleViewForwarder * pViewForwarder)122 void AccessibleOutlineView::ViewForwarderChanged (ChangeType aChangeType,
123 const IAccessibleViewForwarder* pViewForwarder)
124 {
125 AccessibleDocumentViewBase::ViewForwarderChanged (aChangeType, pViewForwarder);
126
127 UpdateChildren();
128 }
129
130
131 //===== XAccessibleContext ==================================================
132
133 sal_Int32 SAL_CALL
getAccessibleChildCount(void)134 AccessibleOutlineView::getAccessibleChildCount (void)
135 throw (uno::RuntimeException)
136 {
137 ThrowIfDisposed ();
138
139 // forward
140 return maTextHelper.GetChildCount();
141 }
142
143
144 uno::Reference<XAccessible> SAL_CALL
getAccessibleChild(sal_Int32 nIndex)145 AccessibleOutlineView::getAccessibleChild (sal_Int32 nIndex)
146 throw (::com::sun::star::uno::RuntimeException)
147 {
148 ThrowIfDisposed ();
149 // Forward request to children manager.
150 return maTextHelper.GetChild(nIndex);
151 }
152
153 #include <drawdoc.hxx>
154 ::rtl::OUString SAL_CALL
getAccessibleName(void)155 AccessibleOutlineView::getAccessibleName(void)
156 throw (::com::sun::star::uno::RuntimeException)
157 {
158 ::rtl::OUString sName = String( SdResId(SID_SD_A11Y_D_PRESENTATION) );
159 ::sd::View* pSdView = static_cast< ::sd::View* >( maShapeTreeInfo.GetSdrView() );
160 if ( pSdView )
161 {
162 SdDrawDocument* pDoc = pSdView->GetDoc();
163 if ( pDoc )
164 {
165 rtl::OUString sFileName = pDoc->getDocAccTitle();
166 if ( !sFileName.getLength() )
167 {
168 ::sd::DrawDocShell* pDocSh = pSdView->GetDocSh();
169 if ( pDocSh )
170 {
171 sFileName = pDocSh->GetTitle( SFX_TITLE_APINAME );
172 }
173 }
174 if ( sFileName.getLength() )
175 {
176 sName = sFileName + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" - ")) + sName;
177 }
178 }
179 }
180 return sName;
181 }
182 //===== XAccessibleEventBroadcaster ========================================
183
addEventListener(const uno::Reference<XAccessibleEventListener> & xListener)184 void SAL_CALL AccessibleOutlineView::addEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) throw (uno::RuntimeException)
185 {
186 // delegate listener handling to children manager.
187 if ( ! IsDisposed())
188 maTextHelper.AddEventListener(xListener);
189 AccessibleContextBase::addEventListener(xListener);
190 }
191
removeEventListener(const uno::Reference<XAccessibleEventListener> & xListener)192 void SAL_CALL AccessibleOutlineView::removeEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) throw (uno::RuntimeException)
193 {
194 // forward
195 if ( ! IsDisposed())
196 maTextHelper.RemoveEventListener(xListener);
197 AccessibleContextBase::removeEventListener(xListener);
198 }
199
200 //===== XServiceInfo ========================================================
201
202 ::rtl::OUString SAL_CALL
getImplementationName(void)203 AccessibleOutlineView::getImplementationName (void)
204 throw (::com::sun::star::uno::RuntimeException)
205 {
206 return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AccessibleOutlineView"));
207 }
208
209
210 //===== XEventListener ======================================================
211
212 void SAL_CALL
disposing(const lang::EventObject & rEventObject)213 AccessibleOutlineView::disposing (const lang::EventObject& rEventObject)
214 throw (::com::sun::star::uno::RuntimeException)
215 {
216 AccessibleDocumentViewBase::disposing (rEventObject);
217 }
218
219 //===== protected internal ==================================================
220
FireEvent(const AccessibleEventObject & aEvent)221 void AccessibleOutlineView::FireEvent(const AccessibleEventObject& aEvent )
222 {
223 // delegate listener handling to children manager.
224 maTextHelper.FireEvent(aEvent);
225 }
226
Activated(void)227 void AccessibleOutlineView::Activated (void)
228 {
229 ::vos::OGuard aGuard( Application::GetSolarMutex() );
230
231 // delegate listener handling to children manager.
232 maTextHelper.SetFocus(sal_True);
233 }
234
Deactivated(void)235 void AccessibleOutlineView::Deactivated (void)
236 {
237 ::vos::OGuard aGuard( Application::GetSolarMutex() );
238
239 // delegate listener handling to children manager.
240 maTextHelper.SetFocus(sal_False);
241 }
242
disposing(void)243 void SAL_CALL AccessibleOutlineView::disposing (void)
244 {
245 // dispose children
246 maTextHelper.Dispose();
247
248 AccessibleDocumentViewBase::disposing ();
249 }
250
251 //===== XPropertyChangeListener =============================================
252
253 void SAL_CALL
propertyChange(const beans::PropertyChangeEvent & rEventObject)254 AccessibleOutlineView::propertyChange (const beans::PropertyChangeEvent& rEventObject)
255 throw (::com::sun::star::uno::RuntimeException)
256 {
257 ThrowIfDisposed ();
258
259 AccessibleDocumentViewBase::propertyChange (rEventObject);
260
261 OSL_TRACE ("AccessibleOutlineView::propertyChange");
262 //add page switch event for slide show mode
263 if (rEventObject.PropertyName == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("CurrentPage")) ||
264 rEventObject.PropertyName == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("PageChange")) )
265 {
266 OSL_TRACE (" current page changed");
267
268 // The current page changed. Update the children accordingly.
269 UpdateChildren();
270 CommitChange(AccessibleEventId::PAGE_CHANGED,rEventObject.NewValue,rEventObject.OldValue);
271 }
272 else if (rEventObject.PropertyName == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("VisibleArea")))
273 {
274 OSL_TRACE (" visible area changed");
275
276 // The visible area changed. Update the children accordingly.
277 UpdateChildren();
278 }
279 else
280 {
281 OSL_TRACE (" unhandled");
282 }
283 OSL_TRACE (" done");
284 }
285
286
287 /// Create a name for this view.
288 ::rtl::OUString
CreateAccessibleName(void)289 AccessibleOutlineView::CreateAccessibleName (void)
290 throw (::com::sun::star::uno::RuntimeException)
291 {
292 ::vos::OGuard aGuard( Application::GetSolarMutex() );
293
294 return String( SdResId(SID_SD_A11Y_I_OUTLINEVIEW_N) );
295 }
296
297
298 /** Create a description for this view. Use the model's description or URL
299 if a description is not available.
300 */
301 ::rtl::OUString
CreateAccessibleDescription(void)302 AccessibleOutlineView::CreateAccessibleDescription (void)
303 throw (::com::sun::star::uno::RuntimeException)
304 {
305 ::vos::OGuard aGuard( Application::GetSolarMutex() );
306
307 return String( SdResId(SID_SD_A11Y_I_OUTLINEVIEW_D) );
308 }
309
UpdateChildren()310 void AccessibleOutlineView::UpdateChildren()
311 {
312 ::vos::OGuard aGuard( Application::GetSolarMutex() );
313
314 // Update visible children
315 maTextHelper.UpdateChildren();
316 }
317
318 } // end of namespace accessibility
319