lok: vcl: fix multiple floatwin removal case more robustly.
[LibreOffice.git] / accessibility / source / extended / accessibleeditbrowseboxcell.cxx
blob67e9ea8ce4641a7d8649928a6d75572eba06001a
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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 <helper/accresmgr.hxx>
21 #include <strings.hrc>
23 #include <extended/accessibleeditbrowseboxcell.hxx>
24 #include <svtools/editbrowsebox.hxx>
25 #include <comphelper/processfactory.hxx>
26 #include <com/sun/star/accessibility/XAccessibleText.hpp>
27 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
29 namespace accessibility
31 using namespace com::sun::star::accessibility;
32 using namespace ::com::sun::star::uno;
33 using namespace ::com::sun::star::lang;
34 using namespace ::com::sun::star::awt;
35 using namespace ::comphelper;
36 using namespace ::svt;
38 EditBrowseBoxTableCell::EditBrowseBoxTableCell(
39 const css::uno::Reference< css::accessibility::XAccessible >& _rxParent,
40 const css::uno::Reference< css::accessibility::XAccessible >& _rxOwningAccessible,
41 const css::uno::Reference< css::accessibility::XAccessibleContext >& _xControlChild,
42 ::vcl::IAccessibleTableProvider& _rBrowseBox,
43 const css::uno::Reference< css::awt::XWindow >& _xFocusWindow,
44 sal_Int32 _nRowPos,
45 sal_uInt16 _nColPos)
46 :AccessibleBrowseBoxCell( _rxParent, _rBrowseBox, _xFocusWindow, _nRowPos, _nColPos )
47 ,OAccessibleContextWrapperHelper( ::comphelper::getProcessComponentContext(), rBHelper, _xControlChild, _rxOwningAccessible, _rxParent )
49 aggregateProxy( m_refCount, *this );
52 EditBrowseBoxTableCell::~EditBrowseBoxTableCell()
54 if ( !rBHelper.bDisposed )
56 acquire(); // to prevent duplicate dtor calls
57 dispose();
61 OUString SAL_CALL EditBrowseBoxTableCell::getImplementationName()
63 return OUString( "com.sun.star.comp.svtools.TableCellProxy" );
66 IMPLEMENT_FORWARD_XINTERFACE2( EditBrowseBoxTableCell, AccessibleBrowseBoxCell, OAccessibleContextWrapperHelper )
68 IMPLEMENT_FORWARD_XTYPEPROVIDER2( EditBrowseBoxTableCell, AccessibleBrowseBoxCell, OAccessibleContextWrapperHelper )
70 void EditBrowseBoxTableCell::notifyTranslatedEvent( const AccessibleEventObject& _rEvent )
72 commitEvent( _rEvent.EventId, _rEvent.NewValue, _rEvent.OldValue );
75 // css::accessibility::XAccessibleComponent
76 sal_Int32 SAL_CALL EditBrowseBoxTableCell::getForeground( )
78 SolarMethodGuard aGuard(getMutex());
79 ensureIsAlive();
81 css::uno::Reference< css::accessibility::XAccessibleComponent > xAccComp( m_xInnerContext, UNO_QUERY );
82 if ( xAccComp.is() )
83 return xAccComp->getForeground();
84 return 0;
87 sal_Int32 SAL_CALL EditBrowseBoxTableCell::getBackground( )
89 SolarMethodGuard aGuard(getMutex());
90 ensureIsAlive();
92 css::uno::Reference< css::accessibility::XAccessibleComponent > xAccComp( m_xInnerContext, UNO_QUERY );
93 if ( xAccComp.is() )
94 return xAccComp->getBackground();
95 return 0;
98 css::uno::Reference< css::accessibility::XAccessible > SAL_CALL EditBrowseBoxTableCell::getAccessibleParent( )
100 return m_xParentAccessible;
103 OUString SAL_CALL EditBrowseBoxTableCell::getAccessibleDescription()
105 SolarMethodGuard aGuard(getMutex());
106 ensureIsAlive();
108 return m_xInnerContext->getAccessibleDescription();
111 OUString SAL_CALL EditBrowseBoxTableCell::getAccessibleName()
113 SolarMethodGuard aGuard(getMutex());
114 ensureIsAlive();
116 return AccResId(RID_STR_ACC_COLUMN_NUM).replaceAll("%COLUMNNUMBER", OUString::number(getColumnPos()-1)) + ", "
117 + AccResId(RID_STR_ACC_ROW_NUM).replaceAll("%ROWNUMBER", OUString::number(getRowPos()));
120 css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL EditBrowseBoxTableCell::getAccessibleRelationSet()
122 SolarMethodGuard aGuard(getMutex());
123 ensureIsAlive();
125 return baseGetAccessibleRelationSet( );
128 css::uno::Reference<css::accessibility::XAccessibleStateSet > SAL_CALL EditBrowseBoxTableCell::getAccessibleStateSet()
130 SolarMethodGuard aGuard(getMutex());
131 ensureIsAlive();
133 return m_xInnerContext->getAccessibleStateSet();
134 // TODO: shouldn't we add an ACTIVE here? Isn't the EditBrowseBoxTableCell always ACTIVE?
137 sal_Int32 SAL_CALL EditBrowseBoxTableCell::getAccessibleChildCount( )
139 SolarMethodGuard aGuard(getMutex());
140 ensureIsAlive();
142 return baseGetAccessibleChildCount();
145 css::uno::Reference< css::accessibility::XAccessible > SAL_CALL EditBrowseBoxTableCell::getAccessibleChild( sal_Int32 i )
147 SolarMethodGuard aGuard(getMutex());
148 ensureIsAlive();
150 return baseGetAccessibleChild( i );
153 sal_Int16 SAL_CALL EditBrowseBoxTableCell::getAccessibleRole()
155 SolarMethodGuard aGuard(getMutex());
156 ensureIsAlive();
158 return m_xInnerContext->getAccessibleRole( );
161 void SAL_CALL EditBrowseBoxTableCell::dispose()
163 // simply disambiguate. Note that the OComponentHelper base in AccessibleBrowseBoxCell
164 // will call our "disposing()", which will call "dispose()" on the OAccessibleContextWrapperHelper
165 // so there is no need to do this here.
166 AccessibleBrowseBoxCell::dispose();
169 void SAL_CALL EditBrowseBoxTableCell::disposing( const css::lang::EventObject& _rSource )
171 AccessibleBrowseBoxCell::disposing( _rSource );
172 OAccessibleContextWrapperHelper::disposing( _rSource );
175 void SAL_CALL EditBrowseBoxTableCell::disposing()
177 SolarMethodGuard aGuard(getMutex());
179 OAccessibleContextWrapperHelper::dispose();
180 // TODO: do we need to dispose our inner object? The base class does this, but is it a good idea?
181 AccessibleBrowseBoxCell::disposing();
184 // EditBrowseBoxTableCell
185 EditBrowseBoxTableCellAccess::EditBrowseBoxTableCellAccess(
186 const css::uno::Reference< css::accessibility::XAccessible >& _rxParent, const css::uno::Reference< css::accessibility::XAccessible >& _rxControlAccessible,
187 const css::uno::Reference< css::awt::XWindow >& _rxFocusWindow,
188 ::vcl::IAccessibleTableProvider& _rBrowseBox, sal_Int32 _nRowPos, sal_uInt16 _nColPos )
189 :WeakComponentImplHelper( m_aMutex )
190 ,m_xParent( _rxParent )
191 ,m_xControlAccessible( _rxControlAccessible )
192 ,m_xFocusWindow( _rxFocusWindow )
193 ,m_pBrowseBox( &_rBrowseBox )
194 ,m_nRowPos( _nRowPos )
195 ,m_nColPos( _nColPos )
199 EditBrowseBoxTableCellAccess::~EditBrowseBoxTableCellAccess( )
203 css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL EditBrowseBoxTableCellAccess::getAccessibleContext( )
205 if ( !m_pBrowseBox || !m_xControlAccessible.is() )
206 throw DisposedException();
207 css::uno::Reference< css::accessibility::XAccessibleContext > xMyContext( m_aContext );
208 if ( !xMyContext.is() )
210 css::uno::Reference< css::accessibility::XAccessibleContext > xInnerContext = m_xControlAccessible->getAccessibleContext();
211 css::uno::Reference< css::accessibility::XAccessible > xMe( this );
213 xMyContext = new EditBrowseBoxTableCell( m_xParent, xMe, xInnerContext, *m_pBrowseBox, m_xFocusWindow, m_nRowPos, m_nColPos );
214 m_aContext = xMyContext;
216 return xMyContext;
219 void SAL_CALL EditBrowseBoxTableCellAccess::disposing()
221 // dispose our context, if it still alive
222 css::uno::Reference< XComponent > xMyContext( m_aContext.get(), UNO_QUERY );
223 if ( xMyContext.is() )
227 xMyContext->dispose();
229 catch( const Exception& )
231 OSL_FAIL( "EditBrowseBoxTableCellAccess::disposing: caught an exception while disposing the context!" );
235 m_pBrowseBox = nullptr;
236 m_xControlAccessible.clear();
237 m_aContext.clear();
238 // NO dispose of the inner object there: it is the css::accessibility::XAccessible of a window, and disposing
239 // it would delete the respective VCL window
241 } // namespace accessibility
243 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */