| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_svtools.hxx" |
| #include <svtools/editbrowsebox.hxx> |
| #include <com/sun/star/accessibility/XAccessible.hpp> |
| #include <com/sun/star/accessibility/AccessibleEventId.hpp> |
| #include "editbrowseboximpl.hxx" |
| #include <comphelper/types.hxx> |
| #include <toolkit/helper/vclunohelper.hxx> |
| #include "svtaccessiblefactory.hxx" |
| |
| namespace svt |
| { |
| using namespace com::sun::star::accessibility; |
| using namespace com::sun::star::uno; |
| using namespace ::com::sun::star::accessibility::AccessibleEventId; |
| |
| // ----------------------------------------------------------------------------- |
| Reference< XAccessible > EditBrowseBox::CreateAccessibleCheckBoxCell(long _nRow, sal_uInt16 _nColumnPos,const TriState& eState,sal_Bool _bEnabled) |
| { |
| Reference< XAccessible > xAccessible( GetAccessible() ); |
| Reference< XAccessibleContext > xAccContext; |
| if ( xAccessible.is() ) |
| xAccContext = xAccessible->getAccessibleContext(); |
| |
| Reference< XAccessible > xReturn; |
| if ( xAccContext.is() ) |
| { |
| xReturn = getAccessibleFactory().createAccessibleCheckBoxCell( |
| xAccContext->getAccessibleChild( ::svt::BBINDEX_TABLE ), |
| *this, |
| NULL, |
| _nRow, |
| _nColumnPos, |
| eState, |
| _bEnabled, |
| sal_True |
| ); |
| } |
| return xReturn; |
| } |
| // ----------------------------------------------------------------------------- |
| Reference< XAccessible > EditBrowseBox::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos ) |
| { |
| return BrowseBox::CreateAccessibleCell( _nRow, _nColumnPos ); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Int32 EditBrowseBox::GetAccessibleControlCount() const |
| { |
| return IsEditing() ? 1 : 0; |
| } |
| // ----------------------------------------------------------------------------- |
| void EditBrowseBox::implCreateActiveAccessible( ) |
| { |
| DBG_ASSERT( IsEditing(), "EditBrowseBox::implCreateActiveAccessible: not to be called if we're not editing currently!" ); |
| DBG_ASSERT( !m_aImpl->m_xActiveCell.is(), "EditBrowseBox::implCreateActiveAccessible: not to be called if the old one is still alive!" ); |
| |
| if ( !m_aImpl->m_xActiveCell.is() && IsEditing() ) |
| { |
| Reference< XAccessible > xCont = aController->GetWindow().GetAccessible(); |
| Reference< XAccessible > xMy = GetAccessible(); |
| if ( xMy.is() && xCont.is() ) |
| { |
| m_aImpl->m_xActiveCell = getAccessibleFactory().createEditBrowseBoxTableCellAccess( |
| xMy, // parent accessible |
| xCont, // control accessible |
| VCLUnoHelper::GetInterface( &aController->GetWindow() ), // focus window (for notifications) |
| *this, // the browse box |
| GetCurRow(), |
| GetColumnPos( GetCurColumnId() ) |
| ); |
| |
| commitBrowseBoxEvent( CHILD, makeAny( m_aImpl->m_xActiveCell ), Any() ); |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------------- |
| Reference< XAccessible > EditBrowseBox::CreateAccessibleControl( sal_Int32 |
| #ifdef DBG_UTIL |
| _nIndex |
| #endif |
| ) |
| { |
| DBG_ASSERT( 0 == _nIndex, "EditBrowseBox::CreateAccessibleControl: invalid index!" ); |
| |
| if ( isAccessibleAlive() ) |
| { |
| if ( !m_aImpl->m_xActiveCell.is() ) |
| implCreateActiveAccessible(); |
| } |
| |
| return m_aImpl->m_xActiveCell; |
| } |
| // ----------------------------------------------------------------------------- |
| Reference<XAccessible > EditBrowseBox::CreateAccessibleRowHeader( sal_Int32 _nRow ) |
| { |
| return BrowseBox::CreateAccessibleRowHeader( _nRow ); |
| } |
| // ----------------------------------------------------------------------------- |
| void EditBrowseBoxImpl::clearActiveCell() |
| { |
| try |
| { |
| ::comphelper::disposeComponent(m_xActiveCell); |
| } |
| catch(const Exception&) |
| { |
| OSL_ENSURE( sal_False, "EditBrowseBoxImpl::clearActiveCell: caught an exception while disposing the AccessibleCell!" ); |
| } |
| |
| m_xActiveCell = NULL; |
| } |
| // ----------------------------------------------------------------------------- |
| void EditBrowseBox::GrabTableFocus() |
| { |
| if ( aController.Is() ) |
| aController->GetWindow().GrabFocus(); |
| } |
| //------------------------------------------------------------------------------ |
| void EditBrowseBox::DetermineFocus( const sal_uInt16 _nGetFocusFlags ) |
| { |
| sal_Bool bFocus = sal_False; |
| for (Window* pWindow = Application::GetFocusWindow(); |
| pWindow && !bFocus; |
| pWindow = pWindow->GetParent()) |
| bFocus = pWindow == this; |
| |
| if (bFocus != bHasFocus) |
| { |
| bHasFocus = bFocus; |
| |
| if ( GetBrowserFlags( ) & EBBF_SMART_TAB_TRAVEL ) |
| { |
| if ( bHasFocus // we got the focus |
| && ( _nGetFocusFlags & GETFOCUS_TAB ) // using the TAB key |
| ) |
| { |
| long nRows = GetRowCount(); |
| sal_uInt16 nCols = ColCount(); |
| |
| if ( ( nRows > 0 ) && ( nCols > 0 ) ) |
| { |
| if ( _nGetFocusFlags & GETFOCUS_FORWARD ) |
| { |
| if ( GetColumnId( 0 ) != 0 ) |
| { |
| GoToRowColumnId( 0, GetColumnId( 0 ) ); |
| } |
| else |
| { // the first column is the handle column -> not focussable |
| if ( nCols > 1 ) |
| GoToRowColumnId( 0, GetColumnId( 1 ) ); |
| } |
| } |
| else if ( _nGetFocusFlags & GETFOCUS_BACKWARD ) |
| { |
| GoToRowColumnId( nRows - 1, GetColumnId( nCols -1 ) ); |
| } |
| } |
| } |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| Rectangle EditBrowseBox::GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 _nIndex) |
| { |
| Rectangle aRect; |
| if ( SeekRow(_nRow) ) |
| { |
| CellController* pController = GetController( |
| _nRow, GetColumnId( sal::static_int_cast< sal_uInt16 >(_nColumnPos) ) ); |
| if ( pController ) |
| aRect = pController->GetWindow().GetCharacterBounds(_nIndex); |
| } |
| return aRect; |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Int32 EditBrowseBox::GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint) |
| { |
| sal_Int32 nRet = -1; |
| if ( SeekRow(_nRow) ) |
| { |
| CellController* pController = GetController( |
| _nRow, GetColumnId( sal::static_int_cast< sal_uInt16 >(_nColumnPos) ) ); |
| if ( pController ) |
| nRet = pController->GetWindow().GetIndexForPoint(_rPoint); |
| } |
| return nRet; |
| } |
| // ----------------------------------------------------------------------------- |
| // ----------------------------------------------------------------------------- |
| } // namespace svt |
| // ----------------------------------------------------------------------------- |
| |
| |