Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 : #include <sal/config.h>
21 :
22 : #include <memory>
23 : #include <utility>
24 :
25 : #include <tools/gen.hxx>
26 : #include "AccessiblePageHeaderArea.hxx"
27 : #include "AccessibleText.hxx"
28 : #include "AccessibilityHints.hxx"
29 : #include "editsrc.hxx"
30 : #include "prevwsh.hxx"
31 : #include "prevloc.hxx"
32 : #include "scresid.hxx"
33 : #include "sc.hrc"
34 :
35 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
36 : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
37 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
38 : #include <editeng/editobj.hxx>
39 : #include <svx/AccessibleTextHelper.hxx>
40 : #include <comphelper/servicehelper.hxx>
41 : #include <unotools/accessiblestatesethelper.hxx>
42 : #include <rtl/ustrbuf.hxx>
43 : #include <toolkit/helper/convert.hxx>
44 : #include <vcl/svapp.hxx>
45 :
46 : using namespace ::com::sun::star;
47 : using namespace ::com::sun::star::accessibility;
48 :
49 : //===== internal ========================================================
50 :
51 13 : ScAccessiblePageHeaderArea::ScAccessiblePageHeaderArea(
52 : const uno::Reference<XAccessible>& rxParent,
53 : ScPreviewShell* pViewShell,
54 : const EditTextObject* pEditObj,
55 : bool bHeader,
56 : SvxAdjust eAdjust)
57 : : ScAccessibleContextBase(rxParent, AccessibleRole::TEXT),
58 13 : mpEditObj(pEditObj->Clone()),
59 : mpTextHelper(NULL),
60 : mpViewShell(pViewShell),
61 : mbHeader(bHeader),
62 26 : meAdjust(eAdjust)
63 : {
64 13 : if (mpViewShell)
65 13 : mpViewShell->AddAccessibilityObject(*this);
66 13 : }
67 :
68 39 : ScAccessiblePageHeaderArea::~ScAccessiblePageHeaderArea()
69 : {
70 13 : if (!ScAccessibleContextBase::IsDefunc() && !rBHelper.bInDispose)
71 : {
72 : // increment refcount to prevent double call off dtor
73 0 : osl_atomic_increment( &m_refCount );
74 0 : dispose();
75 : }
76 26 : }
77 :
78 13 : void SAL_CALL ScAccessiblePageHeaderArea::disposing()
79 : {
80 13 : SolarMutexGuard aGuard;
81 13 : if (mpViewShell)
82 : {
83 13 : mpViewShell->RemoveAccessibilityObject(*this);
84 13 : mpViewShell = NULL;
85 : }
86 13 : if (mpTextHelper)
87 10 : DELETEZ(mpTextHelper);
88 13 : if (mpEditObj)
89 13 : DELETEZ(mpEditObj);
90 :
91 13 : ScAccessibleContextBase::disposing();
92 13 : }
93 :
94 : //===== SfxListener =====================================================
95 :
96 39 : void ScAccessiblePageHeaderArea::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
97 : {
98 39 : const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
99 39 : if (pSimpleHint)
100 : {
101 : // only notify if child exist, otherwise it is not necessary
102 26 : if (pSimpleHint->GetId() == SC_HINT_ACC_VISAREACHANGED)
103 : {
104 10 : if (mpTextHelper)
105 10 : mpTextHelper->UpdateChildren();
106 :
107 10 : AccessibleEventObject aEvent;
108 10 : aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED;
109 10 : aEvent.Source = uno::Reference< XAccessibleContext >(this);
110 10 : CommitChange(aEvent);
111 : }
112 : }
113 39 : ScAccessibleContextBase::Notify(rBC, rHint);
114 39 : }
115 : //===== XAccessibleComponent ============================================
116 :
117 0 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePageHeaderArea::getAccessibleAtPoint(
118 : const awt::Point& rPoint )
119 : throw (uno::RuntimeException, std::exception)
120 : {
121 0 : uno::Reference<XAccessible> xRet;
122 0 : if (containsPoint(rPoint))
123 : {
124 0 : SolarMutexGuard aGuard;
125 0 : IsObjectValid();
126 :
127 0 : if(!mpTextHelper)
128 0 : CreateTextHelper();
129 :
130 0 : xRet = mpTextHelper->GetAt(rPoint);
131 : }
132 :
133 0 : return xRet;
134 : }
135 :
136 : //===== XAccessibleContext ==============================================
137 :
138 : sal_Int32 SAL_CALL
139 26 : ScAccessiblePageHeaderArea::getAccessibleChildCount()
140 : throw (uno::RuntimeException, std::exception)
141 : {
142 26 : SolarMutexGuard aGuard;
143 26 : IsObjectValid();
144 26 : if (!mpTextHelper)
145 10 : CreateTextHelper();
146 26 : return mpTextHelper->GetChildCount();
147 : }
148 :
149 : uno::Reference< XAccessible > SAL_CALL
150 13 : ScAccessiblePageHeaderArea::getAccessibleChild(sal_Int32 nIndex)
151 : throw (uno::RuntimeException,
152 : lang::IndexOutOfBoundsException, std::exception)
153 : {
154 13 : SolarMutexGuard aGuard;
155 13 : IsObjectValid();
156 13 : if (!mpTextHelper)
157 0 : CreateTextHelper();
158 13 : return mpTextHelper->GetChild(nIndex);
159 : }
160 :
161 : uno::Reference<XAccessibleStateSet> SAL_CALL
162 17 : ScAccessiblePageHeaderArea::getAccessibleStateSet()
163 : throw (uno::RuntimeException, std::exception)
164 : {
165 17 : SolarMutexGuard aGuard;
166 34 : uno::Reference<XAccessibleStateSet> xParentStates;
167 17 : if (getAccessibleParent().is())
168 : {
169 17 : uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
170 17 : xParentStates = xParentContext->getAccessibleStateSet();
171 : }
172 17 : utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
173 17 : if (IsDefunc())
174 0 : pStateSet->AddState(AccessibleStateType::DEFUNC);
175 : else
176 : {
177 17 : pStateSet->AddState(AccessibleStateType::ENABLED);
178 17 : pStateSet->AddState(AccessibleStateType::MULTI_LINE);
179 17 : if (isShowing())
180 0 : pStateSet->AddState(AccessibleStateType::SHOWING);
181 17 : if (isVisible())
182 17 : pStateSet->AddState(AccessibleStateType::VISIBLE);
183 : }
184 34 : return pStateSet;
185 : }
186 :
187 : // XServiceInfo
188 :
189 : OUString SAL_CALL
190 3 : ScAccessiblePageHeaderArea::getImplementationName()
191 : throw (uno::RuntimeException, std::exception)
192 : {
193 3 : return OUString("ScAccessiblePageHeaderArea");
194 : }
195 :
196 : uno::Sequence< OUString> SAL_CALL
197 0 : ScAccessiblePageHeaderArea::getSupportedServiceNames()
198 : throw (uno::RuntimeException, std::exception)
199 : {
200 0 : uno::Sequence< OUString > aSequence = ScAccessibleContextBase::getSupportedServiceNames();
201 0 : sal_Int32 nOldSize(aSequence.getLength());
202 0 : aSequence.realloc(nOldSize + 1);
203 :
204 0 : aSequence[nOldSize] = "com.sun.star.sheet.AccessiblePageHeaderFooterAreasView";
205 :
206 0 : return aSequence;
207 : }
208 :
209 : //===== XTypeProvider =======================================================
210 :
211 : uno::Sequence<sal_Int8> SAL_CALL
212 0 : ScAccessiblePageHeaderArea::getImplementationId()
213 : throw (uno::RuntimeException, std::exception)
214 : {
215 0 : return css::uno::Sequence<sal_Int8>();
216 : }
217 :
218 : //===== internal ==============================================================
219 6 : OUString SAL_CALL ScAccessiblePageHeaderArea::createAccessibleDescription()
220 : throw(uno::RuntimeException)
221 : {
222 6 : OUString sDesc;
223 6 : switch (meAdjust)
224 : {
225 : case SVX_ADJUST_LEFT :
226 6 : sDesc = OUString(ScResId(STR_ACC_LEFTAREA_DESCR));
227 6 : break;
228 : case SVX_ADJUST_RIGHT:
229 0 : sDesc = OUString(ScResId(STR_ACC_RIGHTAREA_DESCR));
230 0 : break;
231 : case SVX_ADJUST_CENTER:
232 0 : sDesc = OUString(ScResId(STR_ACC_CENTERAREA_DESCR));
233 0 : break;
234 : default:
235 : OSL_FAIL("wrong adjustment found");
236 : }
237 :
238 6 : return sDesc;
239 : }
240 :
241 1 : OUString SAL_CALL ScAccessiblePageHeaderArea::createAccessibleName()
242 : throw (uno::RuntimeException, std::exception)
243 : {
244 1 : OUString sName;
245 1 : switch (meAdjust)
246 : {
247 : case SVX_ADJUST_LEFT :
248 1 : sName = OUString(ScResId(STR_ACC_LEFTAREA_NAME));
249 1 : break;
250 : case SVX_ADJUST_RIGHT:
251 0 : sName = OUString(ScResId(STR_ACC_RIGHTAREA_NAME));
252 0 : break;
253 : case SVX_ADJUST_CENTER:
254 0 : sName = OUString(ScResId(STR_ACC_CENTERAREA_NAME));
255 0 : break;
256 : default:
257 : OSL_FAIL("wrong adjustment found");
258 : }
259 :
260 1 : return sName;
261 : }
262 :
263 0 : Rectangle ScAccessiblePageHeaderArea::GetBoundingBoxOnScreen() const
264 : throw(::com::sun::star::uno::RuntimeException, std::exception)
265 : {
266 0 : Rectangle aRect;
267 0 : if (mxParent.is())
268 : {
269 0 : uno::Reference<XAccessibleContext> xContext = mxParent->getAccessibleContext();
270 0 : uno::Reference<XAccessibleComponent> xComp(xContext, uno::UNO_QUERY);
271 0 : if (xComp.is())
272 : {
273 : // has the same size and position on screen like the parent
274 0 : aRect = Rectangle(VCLPoint(xComp->getLocationOnScreen()), VCLRectangle(xComp->getBounds()).GetSize());
275 0 : }
276 : }
277 0 : return aRect;
278 : }
279 :
280 20 : Rectangle ScAccessiblePageHeaderArea::GetBoundingBox() const
281 : throw (::com::sun::star::uno::RuntimeException, std::exception)
282 : {
283 20 : Rectangle aRect;
284 20 : if (mxParent.is())
285 : {
286 20 : uno::Reference<XAccessibleContext> xContext = mxParent->getAccessibleContext();
287 40 : uno::Reference<XAccessibleComponent> xComp(xContext, uno::UNO_QUERY);
288 20 : if (xComp.is())
289 : {
290 : // has the same size and position on screen like the parent and so the pos is (0, 0)
291 20 : Rectangle aNewRect(Point(0, 0), VCLRectangle(xComp->getBounds()).GetSize());
292 20 : aRect = aNewRect;
293 20 : }
294 : }
295 :
296 20 : return aRect;
297 : }
298 :
299 10 : void ScAccessiblePageHeaderArea::CreateTextHelper()
300 : {
301 10 : if (!mpTextHelper)
302 : {
303 : ::std::unique_ptr < ScAccessibleTextData > pAccessibleHeaderTextData
304 10 : (new ScAccessibleHeaderTextData(mpViewShell, mpEditObj, mbHeader, meAdjust));
305 20 : ::std::unique_ptr< SvxEditSource > pEditSource (new ScAccessibilityEditSource(std::move(pAccessibleHeaderTextData)));
306 :
307 10 : mpTextHelper = new ::accessibility::AccessibleTextHelper(std::move(pEditSource));
308 20 : mpTextHelper->SetEventSource(this);
309 : }
310 166 : }
311 :
312 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|